জাভাস্ক্রিপ্টে ভেরিয়েবলের সুযোগ কী? কোনও ফাংশনের বাইরের বিপরীতে কি তাদের ভিতরে একই সুযোগ রয়েছে? অথবা এটা এমনকি কোন ব্যাপার? এছাড়াও, ভেরিয়েবলগুলি বিশ্বব্যাপী সংজ্ঞায়িত করা হয় তবে সেগুলি কোথায় সংরক্ষণ করা হবে?
জাভাস্ক্রিপ্টে ভেরিয়েবলের সুযোগ কী? কোনও ফাংশনের বাইরের বিপরীতে কি তাদের ভিতরে একই সুযোগ রয়েছে? অথবা এটা এমনকি কোন ব্যাপার? এছাড়াও, ভেরিয়েবলগুলি বিশ্বব্যাপী সংজ্ঞায়িত করা হয় তবে সেগুলি কোথায় সংরক্ষণ করা হবে?
উত্তর:
জাভাস্ক্রিপ্টের লেক্সিকাল (স্ট্যাটিক নামেও পরিচিত) স্কোপিং এবং ক্লোজার রয়েছে। এর অর্থ উত্স কোডটি দেখে আপনি কোনও শনাক্তকারীর সুযোগ বলতে পারেন।
চারটি স্কোপগুলি হ'ল:
গ্লোবাল এবং মডিউল স্কোপের বিশেষ ক্ষেত্রেগুলির বাইরে, ভেরিয়েবলগুলি var
(ফাংশন স্কোপ), let
(ব্লক স্কোপ) এবং const
(ব্লক স্কোপ) ব্যবহার করে ঘোষণা করা হয় । সনাক্তকারী ঘোষণার অন্যান্য বেশিরভাগ ফর্মগুলির কঠোর মোডে ব্লক সুযোগ রয়েছে।
স্কোপটি কোডবেসের অঞ্চল যা একটি সনাক্তকারী বৈধ।
একটি লেজিকাল এনভায়রনমেন্ট শনাক্তকারী নাম এবং তাদের সাথে যুক্ত মানগুলির মধ্যে একটি ম্যাপিং।
স্কোপটি লিক্সিকাল পরিবেশের একটি লিঙ্কযুক্ত নীড় দ্বারা গঠিত, নীড়ের প্রতিটি স্তর পূর্বপুরুষের মৃত্যুদণ্ড প্রসঙ্গে একটি লেজিকাল পরিবেশের সাথে সঙ্গতিপূর্ণ with
এই লিঙ্কযুক্ত লেজিকাল পরিবেশগুলি একটি স্কোপ "চেইন" গঠন করে। আইডেন্টিফায়ার রেজোলিউশন হ'ল ম্যাচ শনাক্তকারীর জন্য এই চেইনটি ধরে অনুসন্ধান করার প্রক্রিয়া।
সনাক্তকারী রেজোলিউশনটি কেবলমাত্র এক দিকে ঘটে: বাহুতে। এইভাবে, বহিরাগত বর্ণগত পরিবেশগুলি অভ্যন্তরীণ লেক্সিকাল পরিবেশগুলিতে "দেখতে" পারে না।
সেখানে সিদ্ধান্ত নেওয়ার তিন প্রাসঙ্গিক কারণ সুযোগ একটি এর আইডেন্টিফায়ার জাভাস্ক্রিপ্ট মধ্যে:
কয়েকটি উপায় চিহ্নিতকারী হিসাবে ঘোষণা করা যেতে পারে:
var
, let
এবংconst
var
, অ-কঠোর মোডে অনুপস্থিত )import
বিবৃতিeval
কিছু অবস্থান সনাক্তকারী হিসাবে ঘোষণা করা যেতে পারে:
ঘোষিত শনাক্তকারীদের var
ফাংশন স্কোপ ব্যবহার করে ঘোষণা করা হয় , যখন তারা সরাসরি বিশ্বব্যাপী প্রসঙ্গে প্রকাশিত হয়, সে ক্ষেত্রে তারা বিশ্বব্যাপী সামগ্রীতে সম্পত্তি হিসাবে যুক্ত হয় এবং বৈশ্বিক সুযোগ থাকে। eval
ফাংশনে তাদের ব্যবহারের জন্য পৃথক বিধি রয়েছে ।
সনাক্তকারীরা তাদের ব্যবহারের ঘোষনা করেছে let
এবং তাদেরকে অবৈধ প্রাসঙ্গিকভাবে সরাসরি ঘোষিত করা ব্যতীত const
অবকাশের সুযোগ রয়েছে , যার ক্ষেত্রে তাদের বিশ্বব্যাপী সুযোগ রয়েছে।
দ্রষ্টব্য: let
, const
এবং var
সব উত্তোলন করা হয় । এর অর্থ এই যে তাদের সংজ্ঞার যৌক্তিক অবস্থানটি তাদের ঘেরের স্কোপ (ব্লক বা ফাংশন) এর শীর্ষ। যাইহোক, ভেরিয়েবল useing ঘোষিত let
এবং const
বা পড়া যাবে না হওয়া পর্যন্ত নিয়ন্ত্রণ সোর্স কোডে ঘোষণা বিন্দু অতিবাহিত হয়েছে নির্ধারিত হয়। অন্তর্বর্তীকালীন সময়কাল অস্থায়ী মৃত অঞ্চল হিসাবে পরিচিত।
function f() {
function g() {
console.log(x)
}
let x = 1
g()
}
f() // 1 because x is hoisted even though declared with `let`!
ফাংশন প্যারামিটারের নামগুলি ফাংশন বডি এ স্কপ করা হয়। নোট করুন যে এটির জন্য সামান্য জটিলতা রয়েছে। ক্রিয়াকলাপগুলি ডিফল্ট আর্গুমেন্ট হিসাবে ঘোষিত হয় প্যারামিটার তালিকার উপরে , না ফাংশনের মূল অংশটি।
ফাংশন ঘোষণাগুলিতে কঠোর মোডে ব্লক স্কোপ এবং অ-কড়া মোডে ফাংশন স্কোপ থাকে। দ্রষ্টব্য: নন-কড়া মোড বিভিন্ন ব্রাউজারের উদ্দীপক historicalতিহাসিক প্রয়োগের উপর ভিত্তি করে উদ্ভূত নিয়মের একটি জটিল সেট।
নামযুক্ত ফাংশন এক্সপ্রেশনগুলি তাদের কাছে স্কোপ করা হয় (উদাহরণস্বরূপ পুনরাবৃত্তির উদ্দেশ্যে)।
অ-কড়া মোডে, গ্লোবাল অবজেক্টের উপর স্পষ্টভাবে সংজ্ঞায়িত বৈশিষ্ট্যগুলির বৈশ্বিক সুযোগ রয়েছে কারণ বৈশ্বিক অবজেক্ট স্কোপ চেইনের শীর্ষে বসে। কঠোর মোডে এগুলির অনুমতি নেই।
ইন eval
স্ট্রিং, ভেরিয়েবল ঘোষণা ব্যবহার var
বর্তমান সুযোগ স্থাপন করা হবে, বা, যদি eval
বিশ্বব্যাপী বস্তুর উপর বৈশিষ্ট্য হিসেবে পরোক্ষভাবে ব্যবহার করা হয়।
নিম্নলিখিত কারণ নামগুলি ReferenceError নিক্ষেপ করা হবে x
, y
এবং z
ফাংশন কোন অর্থ বাইরে আছে f
।
function f() {
var x = 1
let y = 1
const z = 1
}
console.log(typeof x) // undefined (because var has function scope!)
console.log(typeof y) // undefined (because the body of the function is a block)
console.log(typeof z) // undefined (because the body of the function is a block)
নিম্নলিখিত একটি ReferenceError নিক্ষেপ করা হবে y
এবং z
, কিন্তু না জন্য x
কারণ দৃশ্যমানতা, x
ব্লক দ্বারা সীমাবদ্ধ নয়। ব্লক যে নিয়ন্ত্রণ কাঠামো লাশ সংজ্ঞায়িত পছন্দ if
, for
এবং while
, একই রকম ব্যবহার।
{
var x = 1
let y = 1
const z = 1
}
console.log(x) // 1
console.log(typeof y) // undefined because `y` has block scope
console.log(typeof z) // undefined because `z` has block scope
নিম্নলিখিতটিতে x
লুপের বাইরে দৃশ্যমান কারণ var
কার্যকারিতার সুযোগ রয়েছে:
for(var x = 0; x < 5; ++x) {}
console.log(x) // 5 (note this is outside the loop!)
... এই আচরণের কারণে আপনাকে var
লুপগুলিতে ব্যবহার করে ঘোষিত ভেরিয়েবলগুলি বন্ধ করতে সাবধান হওয়া দরকার । এখানে ভেরিয়েবলের কেবলমাত্র একটি উদাহরণ x
ঘোষণা করা হয়েছে এবং এটি লুপের বাইরে যৌক্তিকভাবে বসে।
নিম্নলিখিত মুদ্রণগুলি 5
, পাঁচবার এবং তারপরে লুপের বাইরে 5
ষষ্ঠবারের জন্য মুদ্রণ করা হবে console.log
:
for(var x = 0; x < 5; ++x) {
setTimeout(() => console.log(x)) // closes over the `x` which is logically positioned at the top of the enclosing scope, above the loop
}
console.log(x) // note: visible outside the loop
নিম্নলিখিত মুদ্রণগুলি ব্লক-স্কোপড undefined
কারণ x
। কলব্যাকগুলি একের পর এক অ্যাসিক্রোনোলে চালিত হয়। let
ভেরিয়েবলের জন্য নতুন আচরণের অর্থ হ'ল প্রতিটি বেনামে ফাংশনটি ভিন্ন ভিন্ন ভেরিয়েবলের উপরে বন্ধ হয়ে যায় x
(এর বিপরীতে এটি সম্পন্ন হত var
), এবং এর 0
মাধ্যমে পূর্ণসংখ্যা 4
মুদ্রিত হয়:
for(let x = 0; x < 5; ++x) {
setTimeout(() => console.log(x)) // `let` declarations are re-declared on a per-iteration basis, so the closures capture different variables
}
console.log(typeof x) // undefined
নিম্নলিখিতগুলি এটিকে ফেলবে না ReferenceError
কারণ এর দৃশ্যমানতা x
ব্লক দ্বারা সীমাবদ্ধ নয়; এটি অবশ্য মুদ্রণ করবে undefined
কারণ ভেরিয়েবলটি আরম্ভ করা হয়নি ( if
বিবৃতিতে)।
if(false) {
var x = 1
}
console.log(x) // here, `x` has been declared, but not initialised
for
ব্যবহার করে একটি লুপের শীর্ষে ঘোষিত একটি পরিবর্তনশীল let
লুপটির শরীরে স্কোপ করা হয়:
for(let x = 0; x < 10; ++x) {}
console.log(typeof x) // undefined, because `x` is block-scoped
নিম্নলিখিতগুলি এটিকে ছুঁড়ে ফেলবে ReferenceError
কারণ এর দৃশ্যমানতা x
ব্লক দ্বারা সীমাবদ্ধ:
if(false) {
let x = 1
}
console.log(typeof x) // undefined, because `x` is block-scoped
চলকগুলি ব্যবহার করে ঘোষিত var
, let
বা const
সমস্ত মডিউলগুলিতে স্কোপ করা হয়:
// module1.js
var x = 0
export function f() {}
//module2.js
import f from 'module1.js'
console.log(x) // throws ReferenceError
নিম্নলিখিতটি বৈশ্বিক অবজেক্টের উপর একটি সম্পত্তি ঘোষণা করবে, কারণ var
বৈশ্বিক প্রসঙ্গের মধ্যে ব্যবহার করে ঘোষিত ভেরিয়েবলগুলি বৈশ্বিক বস্তুর বৈশিষ্ট্য হিসাবে যুক্ত করা হয়েছে:
var x = 1
console.log(window.hasOwnProperty('x')) // true
let
এবং const
বৈশ্বিক প্রেক্ষাপটে বৈশ্বিক বস্তুতে বৈশিষ্ট্যগুলি যুক্ত করবেন না, তবে এখনও বৈশ্বিক সুযোগ রয়েছে:
let x = 1
console.log(window.hasOwnProperty('x')) // false
ফাংশন বডিমে ফাংশন পরামিতিগুলি ঘোষিত হিসাবে বিবেচনা করা যেতে পারে:
function f(x) {}
console.log(typeof x) // undefined, because `x` is scoped to the function
ক্যাচ ব্লক পরামিতিগুলি ক্যাচ-ব্লক বডিটিতে স্কোপ করা হয়:
try {} catch(e) {}
console.log(typeof e) // undefined, because `e` is scoped to the catch block
নামযুক্ত ফাংশন এক্সপ্রেশন কেবল এক্সপ্রেশন নিজেই স্কোপ করা হয়:
(function foo() { console.log(foo) })()
console.log(typeof foo) // undefined, because `foo` is scoped to its own expression
অ-কঠোর মোডে, গ্লোবাল অবজেক্টের উপর স্পষ্টভাবে সংজ্ঞায়িত বৈশিষ্ট্যগুলি বিশ্বব্যাপী বাদ দেওয়া হয়। কঠোর মোডে আপনি একটি ত্রুটি পান।
x = 1 // implicitly defined property on the global object (no "var"!)
console.log(x) // 1
console.log(window.hasOwnProperty('x')) // true
অ-কঠোর মোডে, ফাংশন ঘোষণার ফাংশন সুযোগ রয়েছে। কঠোর মোডে তাদের ব্লক সুযোগ রয়েছে।
'use strict'
{
function foo() {}
}
console.log(typeof foo) // undefined, because `foo` is block-scoped
সুযোগকে কোডের লেজিক্যাল অঞ্চল হিসাবে সংজ্ঞায়িত করা হয় যার উপর একটি সনাক্তকারী বৈধ।
জাভাস্ক্রিপ্টে, প্রতি ফাংশন-বস্তুর একটি লুকিয়েছে [[Environment]]
রেফারেন্স যে একটি রেফারেন্স আভিধানিক পরিবেশ এর মৃত্যুদন্ড প্রসঙ্গ (স্ট্যাক ফ্রেম নয়) যার মধ্যে এটা তৈরি করা হয়েছে।
আপনি যখন কোনও ফাংশন শুরু করেন, তখন লুকানো [[Call]]
পদ্ধতিটি বলা হয়। এই পদ্ধতিটি একটি নতুন এক্সিকিউশন প্রসঙ্গ তৈরি করে এবং নতুন এক্সিকিউশন প্রসঙ্গে এবং ফাংশন-অবজেক্টের লেজিকাল পরিবেশের মধ্যে একটি লিঙ্ক স্থাপন করে। এটি [[Environment]]
ফাংশন-অবজেক্টের মানটি অনুলিপি করে নতুন এক্সিকিউশন প্রসঙ্গে লেক্সিকাল পরিবেশে একটি বহিরাগত রেফারেন্স ফিল্ডে অনুলিপি করে এটি করে।
নোট করুন যে ফাংশন অবজেক্টের নতুন এক্সিকিউশন কনটেক্সট এবং লেজিকাল পরিবেশের মধ্যে এই লিঙ্কটিকে ক্লোজার বলা হয় ।
সুতরাং, জাভাস্ক্রিপ্টে, বহিরাগত রেফারেন্স দ্বারা "চেইন" এর সাথে যুক্ত লিক্সিকাল পরিবেশের মাধ্যমে স্কোপটি প্রয়োগ করা হয়। লেজিকাল পরিবেশের এই শৃঙ্খলাটিকে স্কোপ চেইন বলা হয়, এবং সনাক্তকারী রেজোলিউশনটি ম্যাচিং আইডেন্টিফায়ারারের জন্য শৃঙ্খলে অনুসন্ধান করে ঘটে ।
আরও জানতে ।
জাভাস্ক্রিপ্ট কোনও প্রদত্ত ফাংশনের সুযোগ স্থাপনের জন্য স্কোপ চেইন ব্যবহার করে। সাধারণত একটি বৈশ্বিক সুযোগ থাকে এবং সংজ্ঞায়িত প্রতিটি ফাংশনের নিজস্ব নেস্টেড সুযোগ থাকে। অন্য ফাংশনের মধ্যে সংজ্ঞায়িত যে কোনও ফাংশনের একটি স্থানীয় সুযোগ রয়েছে যা বাইরের ফাংশনের সাথে যুক্ত। এটি সর্বদা উত্সের অবস্থান যা স্কোপটি সংজ্ঞায়িত করে।
স্কোপ চেইনের একটি উপাদান মূলত একটি মূল মানচিত্র যার প্যারেন্ট স্কোপের একটি পয়েন্টার রয়েছে।
কোনও ভেরিয়েবলের সমাধান করার সময়, জাভাস্ক্রিপ্ট অভ্যন্তরীণ স্কোপ থেকে শুরু হয় এবং বাইরে দিকে অনুসন্ধান করে।
বিশ্বব্যাপী ঘোষিত ভেরিয়েবলগুলির একটি বৈশ্বিক সুযোগ রয়েছে। কোনও ফাংশনের মধ্যে ঘোষিত ভেরিয়েবলগুলি সেই ফাংশনে স্কোপ করা হয় এবং একই নামের ছায়া গোষ্ঠী পরিবর্তনশীল।
(আমি নিশ্চিত যে এমন অনেকগুলি সূক্ষ্মতা রয়েছে যা প্রকৃত জাভাস্ক্রিপ্ট প্রোগ্রামাররা অন্যান্য উত্তরে উল্লেখ করতে সক্ষম হবে particular বিশেষত আমি এই পৃষ্ঠাটি জুড়ে এসেছি সঠিক this
সময়ে যে কোনও সময় যা বোঝায়। আশা করি এই প্রারম্ভিক লিঙ্কটি আপনাকে শুরু করার জন্য যথেষ্ট যদিও আশা করি ।)
Ditionতিহ্যগতভাবে, জাভাস্ক্রিপ্টের সত্যই কেবল দুটি ধরণের সুযোগ রয়েছে:
আমি এর সাথে আরও বিস্তারিত জানাব না, যেহেতু ইতিমধ্যে আরও অনেক উত্তর রয়েছে যা পার্থক্যটি ব্যাখ্যা করছে।
সাম্প্রতিকতম জাভাস্ক্রিপ্ট চশমা এখন তৃতীয় সুযোগ অনুমতি দিতে:
Ditionতিহ্যগতভাবে, আপনি আপনার ভেরিয়েবলগুলি এইভাবে তৈরি করেন:
var myVariable = "Some text";
ব্লক স্কোপ ভেরিয়েবলগুলি এভাবে তৈরি করা হয়:
let myVariable = "Some text";
ক্রিয়ামূলক সুযোগ এবং ব্লক স্কোপের মধ্যে পার্থক্য বুঝতে, নিম্নলিখিত কোডটি বিবেচনা করুন:
// i IS NOT known here
// j IS NOT known here
// k IS known here, but undefined
// l IS NOT known here
function loop(arr) {
// i IS known here, but undefined
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
for( var i = 0; i < arr.length; i++ ) {
// i IS known here, and has a value
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
};
// i IS known here, and has a value
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
for( let j = 0; j < arr.length; j++ ) {
// i IS known here, and has a value
// j IS known here, and has a value
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
};
// i IS known here, and has a value
// j IS NOT known here
// k IS known here, but has a value only the second time loop is called
// l IS NOT known here
}
loop([1,2,3,4]);
for( var k = 0; k < arr.length; k++ ) {
// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here
};
for( let l = 0; l < arr.length; l++ ) {
// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS known here, and has a value
};
loop([1,2,3,4]);
// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here
এখানে, আমরা দেখতে পারি যে আমাদের চলকটি j
কেবল লুপের জন্য প্রথমটিতে পরিচিত তবে আগে এবং পরে নয়। তবুও, আমাদের ভেরিয়েবল i
পুরো ফাংশনে পরিচিত।
এছাড়াও, বিবেচনা করুন যে ব্লক স্কোপযুক্ত ভেরিয়েবলগুলি ঘোষণার আগে তাদের জানা নেই কারণ সেগুলি তোলা হয় না। আপনাকে একই ব্লকের মধ্যে একই ব্লকের স্কোপড ভেরিয়েবলটি পুনরায় ঘোষণার অনুমতি নেই। এটি ব্লক স্কোপড ভেরিয়েবলকে বিশ্বব্যাপী বা কার্যকরীভাবে স্কোপযুক্ত ভেরিয়েবলগুলির তুলনায় কম ত্রুটি প্রবণ করে তোলে, যা উত্তোলন করা হয় এবং যা একাধিক ঘোষণার ক্ষেত্রে কোনও ত্রুটি তৈরি করে না।
এটি আজ ব্যবহার করা নিরাপদ কিনা তা আপনার পরিবেশের উপর নির্ভর করে:
আপনি যদি সার্ভার-সাইড জাভাস্ক্রিপ্ট কোড ( নোড.জেএস ) লিখছেন তবে আপনি নিরাপদে let
বিবৃতিটি ব্যবহার করতে পারেন ।
আপনি যদি ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড লিখছেন এবং ব্রাউজার ভিত্তিক ট্রান্সপ্লেলার (যেমন ট্রেসুর বা ব্যাবেল-স্ট্যান্ডেলোন ) ব্যবহার করেন let
তবে আপনি নিরাপদে বিবৃতিটি ব্যবহার করতে পারেন তবে আপনার কোডটি পারফরম্যান্সের ক্ষেত্রে সর্বোত্তম কিছু হতে পারে।
তুমি লেখা ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড এবং একটি নোড ভিত্তিক transpiler (যেমন ব্যবহার করেন, তাহলে traceur শেল স্ক্রিপ্ট বা হট্টগোল ), আপনি নিরাপদে ব্যবহার করতে পারেন let
বিবৃতি। এবং যেহেতু আপনার ব্রাউজারটি কেবল স্থানান্তরিত কোড সম্পর্কে জানবে, পারফরম্যান্সের অপূর্ণতা সীমাবদ্ধ করা উচিত।
আপনি যদি ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্ট কোড লিখছেন এবং ট্রান্সপ্লার ব্যবহার না করেন, আপনাকে ব্রাউজার সমর্থন বিবেচনা করা উচিত।
এগুলি এমন কিছু ব্রাউজার যা একেবারেই সমর্থন let
করে না:
let
আপনার উত্তরটি পড়ার সময় কোন ব্রাউজারগুলি বিবৃতিটিকে সমর্থন করে তার একটি আপ-টু-ডেট ওভিউর জন্য , এই Can I Use
পৃষ্ঠাটি দেখুন ।
(*) বিশ্বব্যাপী এবং কার্যকরীভাবে স্কোপযুক্ত ভেরিয়েবলগুলি জাভাস্ক্রিপ্ট ভেরিয়েবলগুলি উত্তোলন করার কারণে তাদের ঘোষণার আগেই তা আরম্ভ করা যেতে পারে এবং ব্যবহার করা যেতে পারে । এর অর্থ হল যে ঘোষণাগুলি সর্বদা সুযোগের শীর্ষে থাকে to
এখানে একটি উদাহরণ:
<script>
var globalVariable = 7; //==window.globalVariable
function aGlobal( param ) { //==window.aGlobal();
//param is only accessible in this function
var scopedToFunction = {
//can't be accessed outside of this function
nested : 3 //accessible by: scopedToFunction.nested
};
anotherGlobal = {
//global because there's no `var`
};
}
</script>
আপনি ক্লোজারগুলি এবং কীভাবে ব্যক্তিগত সদস্য তৈরি করতে সেগুলি ব্যবহার করবেন তা তদন্ত করতে চাইবেন ।
কীটি, আমি এটি বুঝতে পারি যে, জাভাস্ক্রিপ্টটির আরও সাধারণ সি ব্লক স্কোপিং বনাম ফাংশন স্তরের স্কোপিং রয়েছে।
"জাভাস্ক্রিপ্ট ১.7" (মোজিলার জাভাস্ক্রিপ্টে প্রসারিত) -এর মধ্যেও কেউ let
বিবৃতি সহ ব্লক-স্কোপ ভেরিয়েবল ঘোষণা করতে পারে :
var a = 4;
let (a = 3) {
alert(a); // 3
}
alert(a); // 4
let
।
যখন মূলত দ্বারা ডিজাইন জাভাস্ক্রিপ্ট মধ্যে scoping ধারণা ব্রেন্ডন Eich থেকে এসেছিলেন হাইপারকার্ড স্ক্রিপ্টিং ভাষা HyperTalk ।
এই ভাষায়, প্রদর্শনগুলি সূচক কার্ডগুলির একটি স্ট্যাকের মতোই হয়েছিল। পটভূমি হিসাবে উল্লেখ করা একটি মাস্টার কার্ড ছিল। এটি স্বচ্ছ ছিল এবং নীচের কার্ড হিসাবে দেখা যেতে পারে। এই বেস কার্ডের যে কোনও বিষয়বস্তু এর উপরে থাকা কার্ডগুলির সাথে ভাগ করা হয়েছিল। শীর্ষে রাখা প্রতিটি কার্ডের নিজস্ব সামগ্রী রয়েছে যা পূর্ববর্তী কার্ডের চেয়ে বেশি প্রাধান্য পেয়েছিল, তবে ইচ্ছা করলে পূর্বের কার্ডগুলিতে অ্যাক্সেস ছিল।
ঠিক এভাবেই জাভাস্ক্রিপ্ট স্কোপিং সিস্টেমটি ডিজাইন করা হয়েছে। এটির বিভিন্ন নাম রয়েছে। জাভাস্ক্রিপ্টের কার্ডগুলি এক্সিকিউশন কনটেক্সটস ইসিএমএ হিসাবে পরিচিত । এগুলির প্রতিটি প্রসঙ্গে তিনটি প্রধান অংশ রয়েছে। একটি পরিবর্তনশীল পরিবেশ, একটি লেজিকাল পরিবেশ এবং এটি একটি বাধ্যতামূলক। কার্ডের রেফারেন্সে ফিরে যাওয়া, লেজিকাল পরিবেশে স্ট্যাকের নীচে থাকা পূর্ববর্তী কার্ডগুলি থেকে সমস্ত সামগ্রী থাকে। বর্তমান প্রসঙ্গটি স্ট্যাকের শীর্ষে এবং সেখানে ঘোষিত যে কোনও বিষয়বস্তু পরিবর্তনশীল পরিবেশে সংরক্ষণ করা হবে। নামকরণ সংঘর্ষের ক্ষেত্রে পরিবর্তনশীল পরিবেশ অগ্রাধিকার গ্রহণ করবে।
এই বাঁধাইটি অন্তর্ভুক্ত বস্তুকে নির্দেশ করবে। কখনও কখনও স্কোপ বা এক্সিকিউশন কনটেক্সটগুলি ধারণকৃত অবজেক্ট পরিবর্তন না করে পরিবর্তিত হয়, যেমন একটি ঘোষিত ফাংশনে যেখানে ধারণকৃত বস্তুটি হতে পারে window
বা কনস্ট্রাক্টর ফাংশন।
এই নির্বাহের প্রসঙ্গগুলি তৈরি করা হয় যে কোনও সময় নিয়ন্ত্রণ স্থানান্তরিত হয়। কোডটি কার্যকর করা শুরু হলে নিয়ন্ত্রণ স্থানান্তরিত হয় এবং এটি মূলত ফাংশন সম্পাদন থেকে করা হয়।
সুতরাং এটি প্রযুক্তিগত ব্যাখ্যা। অনুশীলনে, এটি জাভাস্ক্রিপ্টে মনে রাখা গুরুত্বপূর্ণ
এই পৃষ্ঠায় পূর্ববর্তী উদাহরণগুলির মধ্যে একটিতে (5 "বন্ধকরণ") প্রয়োগ করে মৃত্যুদণ্ড কার্যকর করার স্ট্যাক অনুসরণ করা সম্ভব। এই উদাহরণে স্ট্যাকটিতে তিনটি প্রসঙ্গ রয়েছে। এগুলি বাহ্যিক প্রসঙ্গ, ভের ছ দ্বারা আহ্বানিত তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশনটির প্রসঙ্গ এবং ভের ছয়ের তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশনের অভ্যন্তরে ফিরে আসা ক্রিয়ায় প্রসঙ্গ দ্বারা সংজ্ঞায়িত হয়।
i ) বাইরের প্রসঙ্গ এটির একটি পরিবর্তনশীল পরিবেশ রয়েছে = 1
ii ) IIFE প্রসঙ্গে, এটির একটি = 1 এর লেজিকাল পরিবেশ রয়েছে, তবে একটি = 6 এর একটি পরিবর্তনশীল পরিবেশ যা স্ট্যাকের মধ্যে অগ্রাধিকার গ্রহণ করে
iii ) ফিরে আসা ফাংশন প্রসঙ্গে, এটি একটি লেক্সিকাল আছে a = 6 এর পরিবেশ এবং কল করার সময় এটি সতর্কতার সাথে উল্লেখযোগ্য মান।
1) একটি বিশ্বব্যাপী সুযোগ, একটি ফাংশন সুযোগ এবং উইথ এবং ক্যাচ স্কোপ রয়েছে। ভেরিয়েবলের জন্য সাধারণভাবে কোনও 'ব্লক' স্তরের সুযোগ নেই - উইথ এবং ক্যাচ স্টেটমেন্টগুলি তাদের ব্লকে নাম যুক্ত করে।
2) স্কোপগুলি বিশ্বব্যাপী সুযোগের সমস্ত পথে ফাংশন দ্বারা বাসা বাঁধে।
3) প্রোটোটাইপ চেইনে গিয়ে সম্পত্তিগুলি সমাধান করা হয়। উইথ স্টেটমেন্টটি অবজেক্ট প্রোপার্টি নামগুলিকে ব্লক সহ সংজ্ঞায়িত লেজিকাল স্কোপে আনে।
সম্পাদনা করুন: ECMAAScript 6 (সুরেলা) এর জন্য সমর্থন করা নির্দিষ্ট করা হয়েছে, এবং আমি জানি ক্রোম একটি 'সামঞ্জস্য' পতাকাটি অনুমোদন করে, তাই সম্ভবত এটি সমর্থন করে ..
আসুন ব্লক স্তরের স্কোপিংয়ের জন্য সমর্থন হয়ে উঠবে তবে কীওয়ার্ডটি এটি করতে আপনার ব্যবহার করতে হবে।
সম্পাদনা: বেনজমিনের মন্তব্যে থাকা ও ধরা বিবৃতি থেকে ইশারা করার ভিত্তিতে আমি পোস্টটি সম্পাদনা করেছি এবং আরও যুক্ত করেছি। উভয় সঙ্গে এবং ধরা বিবৃতি তাদের নিজ নিজ ব্লক মধ্যে ভেরিয়েবল পরিচয় করিয়ে, এবং যে হয় একটি ব্লক সুযোগ। এই ভেরিয়েবলগুলি তাদের মধ্যে দেওয়া সামগ্রীর বৈশিষ্ট্যের সাথে যুক্ত হয়।
//chrome (v8)
var a = { 'test1':'test1val' }
test1 // error not defined
with (a) { var test1 = 'replaced' }
test1 // undefined
a // a.test1 = 'replaced'
সম্পাদনা: স্পষ্ট উদাহরণ
টেস্ট 1 ব্লকযুক্ত সাথে স্কোপ করা হয় তবে এটি এ.এস্টেস্ট 1-এ যুক্ত হয়। 'ভার টেস্ট 1' উচ্চতর লেজিকাল প্রসঙ্গে (ফাংশন বা গ্লোবাল) নতুন ভেরিয়েবল টেস্ট 1 তৈরি করে, যদি না এটি কোনও - এর সম্পত্তি না থাকে।
বাবা! 'সাথে' ব্যবহার করে সাবধান হন - ভেরিয়েবলটি যেমন ফাংশনে ইতিমধ্যে সংজ্ঞায়িত করা হয় ঠিক তেমনই এটি বস্তু থেকে আমদানিকৃত নামের ক্ষেত্রেও একটি নূপ! ইতিমধ্যে সংজ্ঞায়িত করা নামটির উপরে সামান্য মাথা নেওয়াই এটিকে আরও সুরক্ষিত করে তুলবে। আমি ব্যক্তিগতভাবে এর কারণে কখনই ব্যবহার করব না।
with
বিবৃতি হল ব্লক scoping একটি ফর্ম কিন্তু catch
ক্লজ অনেক বেশি প্রচলিত ফর্ম (মজার বিষয়, V8 কার্যকরী হয় catch
একটি সঙ্গে with
) - প্রায় কাছাকাছি জাভাস্ক্রিপ্ট নিজেই (যেমন, ফাংশন, বিশ্বব্যাপী, চেষ্টা / ধরা ব্লক scoping একমাত্র ফর্ম যে , এবং তাদের ডেরাইভেটিভগুলি সহ), তবে হোস্ট পরিবেশের স্কোপিংয়ের বিভিন্ন ধারণা রয়েছে - উদাহরণস্বরূপ ব্রাউজার এবং নোডজেএস এর ভিএম মডিউলের ইনলাইন ইভেন্টগুলি।
আমি দেখতে পেয়েছি যে জাভাস্ক্রিপ্টে নতুন অনেকেরই বুঝতে সমস্যা হয় যে উত্তরাধিকারটি ডিফল্টরূপে ভাষাতে উপলব্ধ এবং সেই ফাংশনের সুযোগটি এখন পর্যন্ত একমাত্র সুযোগ scope আমি জেএসপ্রেটি নামে গত বছরের শেষে লিখেছি এমন একটি বিউটিফায়ারকে একটি এক্সটেনশন সরবরাহ করেছি। বৈশিষ্ট্যটি কোডটিতে রঙের স্কোপকে রঙ করে এবং সর্বদা সেই সুযোগে ঘোষিত সমস্ত ভেরিয়েবলের সাথে একটি রঙ যুক্ত করে। যখন একটি স্কোপ থেকে বর্ণের সাথে একটি ভেরিয়েবলটি অন্য স্কোপে ব্যবহৃত হয় তখন বন্ধটি দৃশ্যত প্রদর্শিত হয়।
বৈশিষ্ট্যটি এখানে চেষ্টা করুন:
একটি ডেমো এখানে দেখুন:
কোডটি এখানে দেখুন:
বর্তমানে বৈশিষ্ট্যটি 16 টি নেস্টেড ফাংশনগুলির গভীরতার জন্য সমর্থন সরবরাহ করে তবে বর্তমানে বৈশ্বিক ভেরিয়েবলগুলিকে রঙ দেয় না।
জাভাস্ক্রিপ্টের মাত্র দুটি ধরণের সুযোগ রয়েছে:
var
কার্যকরী সুযোগ রয়েছে।যখনই কোনও ফাংশন বলা হয়, একটি ভেরিয়েবল স্কোপ অবজেক্ট তৈরি হয় (এবং স্কোপ চেইনে অন্তর্ভুক্ত) যা জাভাস্ক্রিপ্টে ভেরিয়েবল অনুসরণ করে।
a = "global";
function outer(){
b = "local";
console.log(a+b); //"globallocal"
}
outer();
স্কোপ চেইন ->
a
এবং outer
ফাংশন স্কোপ চেইনে শীর্ষ স্তরে রয়েছে।variable scope object
(এবং স্কোপ চেইনে অন্তর্ভুক্ত থাকে) এর b
ভিতরে ভেরিয়েবল যুক্ত হয় ।এখন যখন কোনও ভেরিয়েবলের a
প্রয়োজন হয় এটি প্রথমে নিকটতম ভেরিয়েবল স্কোপটি অনুসন্ধান করে এবং যদি ভেরিয়েবলটি তার পরিবর্তে ভেরিয়েবল স্কোপ চেইনের পরবর্তী বস্তুতে সরিয়ে না দেয়। যা এই ক্ষেত্রে উইন্ডো স্তর।
কেবলমাত্র অন্য উত্তরগুলিতে যোগ করার জন্য, সুযোগ হ'ল সমস্ত ঘোষিত শনাক্তকারী (ভেরিয়েবল) এর একটি তালিকা-এর তালিকা এবং বর্তমানে এটি সম্পাদনকারী কোডে কীভাবে এগুলি অ্যাক্সেসযোগ্য তা নিয়ে একটি কঠোর নিয়মের প্রয়োগ করে। এই চেহারাটি ভেরিয়েবলকে নির্ধারণের উদ্দেশ্যে হতে পারে, যা এলএইচএস (বাম দিকের দিকের) রেফারেন্স, বা এটির মান পুনরুদ্ধারের উদ্দেশ্যে হতে পারে, যা একটি আরএইচএস (ডানদিকে-পাশ) রেফারেন্স। কোডগুলি সংকলন ও সম্পাদন করার সময় জাভাস্ক্রিপ্ট ইঞ্জিন অভ্যন্তরীণভাবে যা করছে তা এই চেহারাগুলি।
সুতরাং এই দৃষ্টিকোণ থেকে, আমি মনে করি যে কাইল সিম্পসন-এর স্কোপস এবং ক্লোজার্স ইবুক-এ পাওয়া একটি ছবি আমাকে সহায়তা করবে:
তাঁর ইবুক থেকে উদ্ধৃতি:
বিল্ডিংটি আমাদের প্রোগ্রামের নেস্টেড স্কোপ রুলসেট উপস্থাপন করে। বিল্ডিংয়ের প্রথম তলটি আপনি বর্তমানে যেখানেই থাকুন না কেন আপনার বর্তমানে সম্পাদন করার সুযোগটি উপস্থাপন করে। বিল্ডিংয়ের শীর্ষ স্তরটি বিশ্বব্যাপী scope আপনি আপনার বর্তমান মেঝেটি দেখে এলএইচএস এবং আরএইচএসের রেফারেন্সগুলি সমাধান করেন এবং যদি এটি খুঁজে না পান তবে লিফটটি পরবর্তী তলায় নিয়ে যান, সেখানে তাকান, তার পরেরটি এবং আরও অনেক কিছু। একবার আপনি উপরের তলায় (বৈশ্বিক সুযোগ) এ পৌঁছে গেলে আপনি যা সন্ধান করছেন তা পেয়ে যাবেন, বা আপনি পাবেন না। তবে আপনাকে নির্বিশেষে থামতে হবে।
একটি বিষয় লক্ষণীয় যে, "প্রথম ম্যাচটি খুঁজে পাওয়ার পরে স্কোপ লুক আপ বন্ধ হয়ে যায়"।
"স্কোপ স্তরের" এই ধারণাটি ব্যাখ্যা করে যে কেন এটি "নতুন" তৈরি করা স্কোপ দিয়ে "এটি" পরিবর্তন করা যেতে পারে, যদি এটি কোনও নেস্টেড ফাংশনে দেখা হয়। এখানে একটি লিঙ্ক রয়েছে যা জাভাস্ক্রিপ্টের সুযোগ সম্পর্কে আপনি জানতে চেয়েছিলেন , এই সমস্ত বিবরণে যায়
কোড চালান। আশা করি এটি স্কোপিং সম্পর্কে ধারণা দেবে
Name = 'global data';
document.Name = 'current document data';
(function(window,document){
var Name = 'local data';
var myObj = {
Name: 'object data',
f: function(){
alert(this.Name);
}
};
myObj.newFun = function(){
alert(this.Name);
}
function testFun(){
alert("Window Scope : " + window.Name +
"\nLocal Scope : " + Name +
"\nObject Scope : " + this.Name +
"\nCurrent document Scope : " + document.Name
);
}
testFun.call(myObj);
})(window,document);
গ্লোবাল ভেরিয়েবলগুলি হুবহু গ্লোবাল তারার মতো (জ্যাকি চ্যান, নেলসন ম্যান্ডেলা)। আপনার অ্যাপ্লিকেশনটির যে কোনও অংশ থেকে আপনি এগুলি অ্যাক্সেস করতে পারেন (মানটি নির্ধারণ করুন বা সেট করুন)। গ্লোবাল ফাংশনগুলি বিশ্বব্যাপী ইভেন্টগুলির মতো (নতুন বছর, ক্রিসমাস)। আপনি আপনার অ্যাপ্লিকেশনটির যে কোনও অংশ থেকে তাদের সম্পাদন (কল) করতে পারেন।
//global variable
var a = 2;
//global function
function b(){
console.log(a); //access global variable
}
আপনি যদি মার্কিন যুক্তরাষ্ট্রে থাকেন তবে আপনি কিম কারদাশিয়ানকে জানেন কুখ্যাত সেলেব্রিটি (তিনি কোনওভাবে ট্যাবলয়েড তৈরি করতে পরিচালিত)। তবে আমেরিকার বাইরের লোকেরা তাকে চিনতে পারবে না। তিনি তার স্থানীয় অঞ্চলে আবদ্ধ একটি স্থানীয় তারকা।
স্থানীয় পরিবর্তনগুলি স্থানীয় তারার মতো। আপনি কেবল এগুলি অ্যাক্সেস করতে পারবেন (মানটি পান বা সেট করুন) সুযোগের মধ্যে। একটি স্থানীয় ফাংশন স্থানীয় ইভেন্টগুলির মতো - আপনি কেবলমাত্র সেই সুযোগের মধ্যেই (উদযাপন) সম্পাদন করতে পারেন। আপনি যদি সুযোগের বাইরে থেকে এগুলি অ্যাক্সেস করতে চান তবে আপনি একটি রেফারেন্স ত্রুটি পাবেন
function b(){
var d = 21; //local variable
console.log(d);
function dog(){ console.log(a); }
dog(); //execute local function
}
console.log(d); //ReferenceError: dddddd is not defined
এখানে মাত্র দুটি ধরণের জাভাস্ক্রিপ্ট স্কোপ রয়েছে:
সুতরাং, ফাংশন ব্যতীত অন্য কোনও ব্লক একটি নতুন সুযোগ তৈরি করে না। এটি ব্যাখ্যা করে যে কেন লুপগুলি বাইরের স্কোপযুক্ত ভেরিয়েবলগুলি ওভাররাইট করে:
var i = 10, v = 10;
for (var i = 0; i < 5; i++) { var v = 5; }
console.log(i, v);
// output 5 5
পরিবর্তে ফাংশন ব্যবহার:
var i = 10, v = 10;
$.each([0, 1, 2, 3, 4], function(i) { var v = 5; });
console.log(i,v);
// output 10 10
প্রথম উদাহরণে, কোনও ব্লকের সুযোগ ছিল না, তাই প্রাথমিকভাবে ঘোষিত ভেরিয়েবলগুলি ওভাররাইট করা হয়েছিল। দ্বিতীয় উদাহরণে, ফাংশনটির কারণে একটি নতুন সুযোগ ছিল, সুতরাং প্রাথমিকভাবে ঘোষিত ভেরিয়েবলগুলি ছায়াযুক্ত ছিল, এবং ওভাররাইট নয়।
জাভাস্ক্রিপ্টের স্কোপিংয়ের ক্ষেত্রে আপনার যা জানা দরকার তা বাদে:
সুতরাং আপনি দেখতে পাচ্ছেন যে জাভাস্ক্রিপ্টের স্কোপিং আসলে খুব সহজ, যদিও এটি সর্বদা স্বজ্ঞাত নয়। সচেতন হওয়ার জন্য কয়েকটি বিষয়:
সুতরাং এই কোড:
var i = 1;
function abc() {
i = 2;
var i = 3;
}
console.log(i); // outputs 1
সমান:
var i = 1;
function abc() {
var i; // var declaration moved to the top of the scope
i = 2;
i = 3; // the assignment stays where it is
}
console.log(i);
এটি পাল্টা স্বজ্ঞাত মনে হতে পারে, তবে এটি একটি অত্যাবশ্যক ভাষা ডিজাইনারের দৃষ্টিকোণ থেকে বোঝা যায়।
const
' এবং ' let
'অন্যান্য অন্যান্য প্রধান ভাষার মতো আপনার তৈরি প্রতিটি ভেরিয়েবলের জন্য আপনার ব্লক স্কোপিং ব্যবহার করা উচিত। var
হয় অপ্রচলিত । এটি আপনার কোডটিকে নিরাপদ এবং আরও রক্ষণাবেক্ষণযোগ্য করে তোলে।
const
95% ক্ষেত্রে ব্যবহার করা উচিত । এটি এটিকে এমন করে তোলে যাতে পরিবর্তনশীল উল্লেখটি পরিবর্তন করতে পারে না change অ্যারে, অবজেক্ট এবং ডোম নোডের বৈশিষ্ট্যগুলি পরিবর্তিত হতে পারে এবং সম্ভবত এটি হওয়া উচিত const
।
let
পুনরায় নিয়োগের প্রত্যাশায় যে কোনও ভেরিয়েবলের জন্য ব্যবহার করা উচিত। এটি একটি for লুপের মধ্যে অন্তর্ভুক্ত। আপনি যদি কখনও আরম্ভের বাইরে মান পরিবর্তন করেন তবে ব্যবহার করুন let
।
ব্লক স্কোপটির অর্থ হল যে ভেরিয়েবলটি কেবলমাত্র বন্ধনীগুলির মধ্যে এটি ঘোষিত হয় এর মধ্যে উপলব্ধ। এটি আপনার ক্ষেত্রের মধ্যে তৈরি অজ্ঞাতনামা ফাংশন সহ অভ্যন্তরীণ স্কোপগুলিতে প্রসারিত।
এই কৌতূহল উদাহরণ চেষ্টা করুন। নীচের উদাহরণে যদি একটি 0 তে সংখ্যার সূচনা হয়, আপনি 0 এবং তারপরে দেখতে পাবেন 1 টি বাদে একটি অবজেক্ট এবং জাভাস্ক্রিপ্ট এর অনুলিপি না হয়ে f1 এর পয়েন্টারটি পাস করবে। ফলাফল আপনি উভয় একই সতর্কতা পেতে।
var a = new Date();
function f1(b)
{
b.setDate(b.getDate()+1);
alert(b.getDate());
}
f1(a);
alert(a.getDate());
জেএসে কেবলমাত্র ফাংশন স্কোপ রয়েছে। স্কোপ ব্লক নয়! আপনি কী উত্তোলন করছেন তা দেখতে পাবেন।
var global_variable = "global_variable";
var hoisting_variable = "global_hoist";
// Global variables printed
console.log("global_scope: - global_variable: " + global_variable);
console.log("global_scope: - hoisting_variable: " + hoisting_variable);
if (true) {
// The variable block will be global, on true condition.
var block = "block";
}
console.log("global_scope: - block: " + block);
function local_function() {
var local_variable = "local_variable";
console.log("local_scope: - local_variable: " + local_variable);
console.log("local_scope: - global_variable: " + global_variable);
console.log("local_scope: - block: " + block);
// The hoisting_variable is undefined at the moment.
console.log("local_scope: - hoisting_variable: " + hoisting_variable);
var hoisting_variable = "local_hoist";
// The hoisting_variable is now set as a local one.
console.log("local_scope: - hoisting_variable: " + hoisting_variable);
}
local_function();
// No variable in a separate function is visible into the global scope.
console.log("global_scope: - local_variable: " + local_variable);
আমার উপলব্ধিটি হল যে এখানে 3 টি স্কোপ রয়েছে: বিশ্বব্যাপী সুযোগ, বিশ্বব্যাপী উপলব্ধ; স্থানীয় সুযোগ, ব্লক নির্বিশেষে একটি সম্পূর্ণ ফাংশন উপলভ্য; এবং ব্লক স্কোপ, কেবল এটির জন্য ব্যবহৃত ব্লক, বিবৃতি, বা প্রকাশের জন্য উপলব্ধ। গ্লোবাল এবং লোকাল স্কোপটি 'ভ্যার' কীওয়ার্ড দিয়ে চিহ্নিত করা হয়, হয় কোনও ফাংশনের মধ্যে বা বাইরে, এবং ব্লক স্কোপটি 'লেট' কীওয়ার্ড দ্বারা নির্দেশিত হয়।
যারা বিশ্বাস করেন যে কেবলমাত্র বিশ্বব্যাপী এবং স্থানীয় সুযোগ রয়েছে, দয়া করে ব্যাখ্যা করুন কেন মোজিলার জেএসে ব্লক স্কোপের সংক্ষিপ্তসারগুলি বর্ণনা করার জন্য একটি সম্পূর্ণ পৃষ্ঠা থাকবে।
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
এখনও খুব সাধারণ সমস্যা বর্ণিত হয়নি যে ফ্রন্ট-এন্ড কোডারগুলি প্রায়শই সঞ্চালিত হয় সেটি হ'ল এইচটিএমএলে একটি ইনলাইন ইভেন্ট হ্যান্ডলারের কাছে দৃশ্যমান - উদাহরণস্বরূপ,
<button onclick="foo()"></button>
কোনও on*
অ্যাট্রিবিউট রেফারেন্স করতে পারে এমন ভেরিয়েবলের সুযোগটি অবশ্যই হ'ল:
querySelector
স্বতন্ত্র ভেরিয়েবল হিসাবে চিহ্নিত হবে document.querySelector
; বিরল)অন্যথায়, হ্যান্ডলারটি চাওয়া হলে আপনি একটি রেফারেন্সআরআর পাবেন। সুতরাং, উদাহরণস্বরূপ, যদি ইনলাইন হ্যান্ডলারটি এমন কোনও ফাংশনকে উল্লেখ করে যা ভিতরে সংজ্ঞায়িত করা হয় window.onload
বা $(function() {
, তবে রেফারেন্স ব্যর্থ হবে, কারণ ইনলাইন হ্যান্ডলারটি কেবল বৈশ্বিক স্কোপগুলিতে পরিবর্তনকে উল্লেখ করতে পারে এবং ফাংশনটি বিশ্বব্যাপী নয়:
এর প্রোপার্টি document
এবং উপাদান হ্যান্ডলার করার সময় ইনলাইন হ্যান্ডেলার ভিতরে স্বতন্ত্র ভেরিয়েবল যেমন রেফারেন্সড হতে পারে কারণ ইনলাইন হ্যান্ডেলার প্রার্থনা করছে সংযুক্ত করা হয় বৈশিষ্ট্য ভিতরে দুই with
ব্লক , জন্য এক document
উপাদান জন্য। এই হ্যান্ডলারের অভ্যন্তরে ভেরিয়েবলের স্কোপ চেইনটি অত্যন্ত অপ্রচলিত , এবং একটি কার্যকরী ইভেন্ট হ্যান্ডলারের সম্ভবত বিশ্বব্যাপী হওয়ার জন্য কোনও ফাংশন প্রয়োজন হবে (এবং অপ্রয়োজনীয় বৈশ্বিক দূষণ সম্ভবত এড়ানো উচিত )।
যেহেতু ইনলাইন হ্যান্ডলারের ভিতরে স্কোপ চেইনটি এতটাই অদ্ভুত , এবং যেহেতু ইনলাইন হ্যান্ডলারগুলি কাজ করার জন্য বিশ্বব্যাপী দূষণের প্রয়োজন, এবং যেহেতু ইনলাইন হ্যান্ডলারগুলি মাঝে মধ্যে তর্কগুলি পাস করার সময় কুশ্রী স্ট্রিং পলায়নের প্রয়োজন হয়, তাই সম্ভবত এগুলি এড়ানো সহজ। পরিবর্তে, addEventListener
HTML মার্কআপের পরিবর্তে জাভাস্ক্রিপ্ট ব্যবহার করে ইভেন্ট হ্যান্ডলারগুলি সংযুক্ত করুন ।
একটি পৃথক নোটে, সাধারণ <script>
ট্যাগগুলির বিপরীতে , যা শীর্ষ স্তরে চলে, ES6 মডিউলগুলির অভ্যন্তর কোডটি তার নিজস্ব স্কোপে চলে। একটি সাধারণ <script>
ট্যাগের শীর্ষে সংজ্ঞায়িত একটি পরিবর্তনীয় গ্লোবাল, সুতরাং আপনি অন্যান্য <script>
ট্যাগগুলিতে এটি উল্লেখ করতে পারেন , এর মতো:
তবে ES6 মডিউলের শীর্ষ স্তরটি বিশ্বব্যাপী নয় । কোনও ES6 মডিউলের শীর্ষে ঘোষিত একটি চলক কেবলমাত্র সেই মডিউলের অভ্যন্তরে দৃশ্যমান হবে, যদি না ভেরিয়েবলটি সুস্পষ্টভাবে export
সম্পাদনা করা হয়, বা এটি বিশ্বব্যাপী কোনও সামগ্রীর জন্য নির্ধারিত না হয়।
একটি ES6 মডিউলটির শীর্ষ স্তরটি কোনও সাধারণের শীর্ষ স্তরের আইআইএফইয়ের অভ্যন্তরের সাথে সমান <script>
। মডিউলটি বিশ্বব্যাপী যে কোনও চলকগুলি উল্লেখ করতে পারে এবং মডিউলটির জন্য স্পষ্টভাবে নকশাকৃত না হলে কিছুই মডিউলটির অভ্যন্তরে কিছুই উল্লেখ করতে পারে না।
জাভাস্ক্রিপ্টে দুটি ধরণের সুযোগ রয়েছে:
নীচের ফাংশনে একটি স্থানীয় স্কোপ ভেরিয়েবল রয়েছে carName
। এবং এই পরিবর্তনশীল ফাংশন বাইরে থেকে অ্যাক্সেসযোগ্য।
function myFunction() {
var carName = "Volvo";
alert(carName);
// code here can use carName
}
নীচের শ্রেণীর একটি গ্লোবাল স্কোপ ভেরিয়েবল রয়েছে carName
। এবং এই পরিবর্তনশীল ক্লাসের যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য।
class {
var carName = " Volvo";
// code here can use carName
function myFunction() {
alert(carName);
// code here can use carName
}
}
ES5
এবং পূর্বে:জাভাস্ক্রিপ্টের ভেরিয়েবলগুলি প্রাথমিকভাবে (প্রাক ES6
) লেক্সিকালি ফাংশন স্কোপড ছিল। লেক্সিকালি স্কোপড শব্দের অর্থ আপনি কোডটি 'তাকিয়ে' দেখিয়ে ভেরিয়েবলের সুযোগ দেখতে পাচ্ছেন।
var
কীওয়ার্ড সহ ঘোষিত প্রতিটি ভেরিয়েবল ফাংশনে স্কোপ করা হয়। তবে অন্য ফাংশনটি যদি সেই ফাংশনের মধ্যে ঘোষণা করা হয় তবে সেই ফাংশনগুলির বাইরের ফাংশনের ভেরিয়েবলগুলিতে অ্যাক্সেস থাকবে। একে স্কোপ চেইন বলে । এটি নিম্নলিখিত পদ্ধতিতে কাজ করে:
// global scope
var foo = 'global';
var bar = 'global';
var foobar = 'global';
function outerFunc () {
// outerFunc scope
var foo = 'outerFunc';
var foobar = 'outerFunc';
innerFunc();
function innerFunc(){
// innerFunc scope
var foo = 'innerFunc';
console.log(foo);
console.log(bar);
console.log(foobar);
}
}
outerFunc();
যখন আমরা ভেরিয়েবল লগ ইন করার চেষ্টা করছেন ঘটবে foo
, bar
এবং foobar
কনসোলের নিম্নলিখিত হল:
innerFunc
যায়। সুতরাং, foo এর মানটি স্ট্রিংয়ে সমাধান করা হয় innerFunc
।innerFunc
। সুতরাং, আমাদের স্কোপ চেইনে আরোহণ করা প্রয়োজন । আমরা প্রথমে বাহ্যিক ফাংশনটি দেখি যেখানে ফাংশনটি innerFunc
সংজ্ঞায়িত করা হয়েছিল। এটি ফাংশন outerFunc
। সুযোগ outerFunc
আমরা যা STRING 'outerFunc' ঝুলিতে পরিবর্তনশীল বার, খুঁজে পেতে পারেন।ES6
(ES 2015) এবং আরও পুরানো:লেক্সিকালি স্কোপ এবং স্কোপচেইনের একই ধারণাগুলি এখনও প্রয়োগ হয় ES6
। তবে ভেরিয়েবলগুলি ঘোষণার জন্য একটি নতুন উপায় চালু করা হয়েছিল। নিম্নলিখিত রয়েছে:
let
: একটি ব্লক স্কোপড ভেরিয়েবল তৈরি করেconst
: একটি ব্লক স্কোপড ভেরিয়েবল তৈরি করে যা আরম্ভ করতে হবে এবং পুনরায় নিয়োগ দেওয়া যাবে নামধ্যে সবচেয়ে বড় পার্থক্য var
এবং let
/ const
যে var
ফাংশন যেহেতু scoped হয় let
/ const
ব্লক scoped হয়। এটি চিত্রিত করার জন্য এখানে একটি উদাহরণ দেওয়া হল:
let letVar = 'global';
var varVar = 'global';
function foo () {
if (true) {
// this variable declared with let is scoped to the if block, block scoped
let letVar = 5;
// this variable declared with let is scoped to the function block, function scoped
var varVar = 10;
}
console.log(letVar);
console.log(varVar);
}
foo();
উপরের উদাহরণে লেটবার মানটি বিশ্বব্যাপী লগ করে কারণ এর সাথে ঘোষিত ভেরিয়েবলগুলি let
ব্লক স্কোপড। এগুলি তাদের নিজ নিজ ব্লকের বাইরে থাকা বন্ধ করে দেয়, সুতরাং চলকটি যদি ব্লকের বাইরে প্রবেশ করা যায় না।
ইকামাস্ক্রিপ্ট 5 এ মূলত দুটি স্কোপ রয়েছে, স্থানীয় সুযোগ এবং বৈশ্বিক স্কোপ তবে একমা স্ক্রিপ্ট 6 এ আমাদের প্রধানত তিনটি স্কোপ, স্থানীয় সুযোগ, গ্লোবাল স্কোপ এবং ব্লক স্কোপ নামে একটি নতুন স্কোপ রয়েছে ।
ব্লক স্কোপের উদাহরণ হ'ল: -
for ( let i = 0; i < 10; i++)
{
statement1...
statement2...// inside this scope we can access the value of i, if we want to access the value of i outside for loop it will give undefined.
}
ইসমাস্ক্রিপ্ট 6 লেট এবং কনস্টের কীওয়ার্ডগুলি প্রবর্তন করেছে। এই কীওয়ার্ডগুলি ভের-কিওয়ার্ডের জায়গায় ব্যবহার করা যেতে পারে। ভের কীওয়ার্ডের বিপরীতে, লেট এবং কন্সট কিওয়ার্ডগুলি ব্লক স্টেটমেন্টগুলির মধ্যে স্থানীয় সুযোগের ঘোষণাকে সমর্থন করে।
var x = 10
let y = 10
const z = 10
{
x = 20
let y = 20
const z = 20
{
x = 30
// x is in the global scope because of the 'var' keyword
let y = 30
// y is in the local scope because of the 'let' keyword
const z = 30
// z is in the local scope because of the 'const' keyword
console.log(x) // 30
console.log(y) // 30
console.log(z) // 30
}
console.log(x) // 30
console.log(y) // 20
console.log(z) // 20
}
console.log(x) // 30
console.log(y) // 10
console.log(z) // 10
আমি গ্রহণযোগ্য উত্তরটি সত্যিই পছন্দ করি তবে আমি এটি যুক্ত করতে চাই:
স্কোপ সমস্ত ঘোষিত শনাক্তকারী (ভেরিয়েবল) এর তালিকা অনুসন্ধান সংগ্রহ করে এবং বজায় রাখে এবং কীভাবে এগুলি বর্তমানে সম্পাদনকারী কোডে অ্যাক্সেসযোগ্য তা সম্পর্কে একটি কঠোর নিয়ম প্রয়োগ করে।
স্কোপটি তাদের সনাক্তকারী নাম দিয়ে ভেরিয়েবলগুলি সন্ধান করার নিয়মের একটি সেট।
জাভাস্ক্রিপ্টে দুটি ধরণের স্কোপ রয়েছে।
গ্লোবাল স্কোপ : ভেরিয়েবল যা বৈশ্বিক স্কোপে ঘোষণা করা হয় প্রোগ্রামের যে কোনও জায়গায় খুব সহজেই ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ:
var carName = " BMW";
// code here can use carName
function myFunction() {
// code here can use carName
}
কার্যকরী সুযোগ বা স্থানীয় সুযোগ : এই সুযোগে ঘোষিত ভেরিয়েবল কেবল নিজস্ব ফাংশনে ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ:
// code here can not use carName
function myFunction() {
var carName = "BMW";
// code here can use carName
}