জাভাস্ক্রিপ্টে ভেরিয়েবলের সুযোগ কী?


2011

জাভাস্ক্রিপ্টে ভেরিয়েবলের সুযোগ কী? কোনও ফাংশনের বাইরের বিপরীতে কি তাদের ভিতরে একই সুযোগ রয়েছে? অথবা এটা এমনকি কোন ব্যাপার? এছাড়াও, ভেরিয়েবলগুলি বিশ্বব্যাপী সংজ্ঞায়িত করা হয় তবে সেগুলি কোথায় সংরক্ষণ করা হবে?


4
এখানে আরেকটি চমৎকার লিংক ": মনের মধ্যে এই বিষয়টি রাখার জাভাস্ক্রিপ্ট পরিধি ও বন্ধ ব্যাখ্যা "।
ফুল-স্ট্যাক সফটওয়্যার ইঞ্জিনিয়ার

9
এখানে একটি নিবন্ধ যা এটি খুব সুন্দরভাবে ব্যাখ্যা করেছে। জাভাস্ক্রিপ্টের ভেরিয়েবল স্কোপ সম্পর্কে আপনার যা কিছু জানা দরকার
সৌরব পরখ

2
পূর্বে উল্লিখিত কাইলি সিম্পসন এর ই-বুক GitHub থেকে পড়তে পাওয়া যায়, এবং এটি আপনার সব জাভাস্ক্রিপ্ট সুযোগগুলি & বন্ধ সম্পর্কে জানা প্রয়োজন বলে। আপনি এটি এখানে খুঁজে পেতে পারেন: github.com/getify/ You-Dont-Know-JS / blob / master /… এটি "আপনি জেএস জানেন না" বইয়ের সিরিজের অংশ , যা প্রত্যেকেরই জানতে আগ্রহী তাদের পক্ষে দুর্দান্ত জাভাস্ক্রিপ্ট সম্পর্কে আরও।
3rik82

উত্তর:


2534

TLDR

জাভাস্ক্রিপ্টের লেক্সিকাল (স্ট্যাটিক নামেও পরিচিত) স্কোপিং এবং ক্লোজার রয়েছে। এর অর্থ উত্স কোডটি দেখে আপনি কোনও শনাক্তকারীর সুযোগ বলতে পারেন।

চারটি স্কোপগুলি হ'ল:

  1. গ্লোবাল - সবকিছু দ্বারা দৃশ্যমান
  2. ফাংশন - একটি ফাংশনের মধ্যে দৃশ্যমান (এবং এর উপ-ফাংশন এবং ব্লক)
  3. ব্লক - একটি ব্লকের মধ্যে দৃশ্যমান (এবং এর সাব-ব্লক)
  4. মডিউল - একটি মডিউল মধ্যে দৃশ্যমান

গ্লোবাল এবং মডিউল স্কোপের বিশেষ ক্ষেত্রেগুলির বাইরে, ভেরিয়েবলগুলি var(ফাংশন স্কোপ), let(ব্লক স্কোপ) এবং const(ব্লক স্কোপ) ব্যবহার করে ঘোষণা করা হয় । সনাক্তকারী ঘোষণার অন্যান্য বেশিরভাগ ফর্মগুলির কঠোর মোডে ব্লক সুযোগ রয়েছে।

সংক্ষিপ্ত বিবরণ

স্কোপটি কোডবেসের অঞ্চল যা একটি সনাক্তকারী বৈধ।

একটি লেজিকাল এনভায়রনমেন্ট শনাক্তকারী নাম এবং তাদের সাথে যুক্ত মানগুলির মধ্যে একটি ম্যাপিং।

স্কোপটি লিক্সিকাল পরিবেশের একটি লিঙ্কযুক্ত নীড় দ্বারা গঠিত, নীড়ের প্রতিটি স্তর পূর্বপুরুষের মৃত্যুদণ্ড প্রসঙ্গে একটি লেজিকাল পরিবেশের সাথে সঙ্গতিপূর্ণ with

এই লিঙ্কযুক্ত লেজিকাল পরিবেশগুলি একটি স্কোপ "চেইন" গঠন করে। আইডেন্টিফায়ার রেজোলিউশন হ'ল ম্যাচ শনাক্তকারীর জন্য এই চেইনটি ধরে অনুসন্ধান করার প্রক্রিয়া।

সনাক্তকারী রেজোলিউশনটি কেবলমাত্র এক দিকে ঘটে: বাহুতে। এইভাবে, বহিরাগত বর্ণগত পরিবেশগুলি অভ্যন্তরীণ লেক্সিকাল পরিবেশগুলিতে "দেখতে" পারে না।

সেখানে সিদ্ধান্ত নেওয়ার তিন প্রাসঙ্গিক কারণ সুযোগ একটি এর আইডেন্টিফায়ার জাভাস্ক্রিপ্ট মধ্যে:

  1. কীভাবে সনাক্তকারী ঘোষণা করা হয়েছিল
  2. যেখানে একটি সনাক্তকারী ঘোষণা করা হয়েছিল
  3. আপনি কঠোর মোডে বা অন-কড়া মোডে থাকুন না কেন

কয়েকটি উপায় চিহ্নিতকারী হিসাবে ঘোষণা করা যেতে পারে:

  1. var, letএবংconst
  2. ফাংশন পরামিতি
  3. ব্লক প্যারামিটারটি ধরুন
  4. কার্য ঘোষণা
  5. নামকরণ ফাংশন এক্সপ্রেশন
  6. গ্লোবাল অবজেক্টে স্পষ্টভাবে সংজ্ঞায়িত বৈশিষ্ট্য (যেমন var, অ-কঠোর মোডে অনুপস্থিত )
  7. import বিবৃতি
  8. eval

কিছু অবস্থান সনাক্তকারী হিসাবে ঘোষণা করা যেতে পারে:

  1. বৈশ্বিক প্রেক্ষাপটে
  2. ফাংশন বডি
  3. সাধারণ ব্লক
  4. একটি নিয়ন্ত্রণ কাঠামোর শীর্ষ (যেমন লুপ, যদি, যখন ইত্যাদি)
  5. কাঠামো শরীর নিয়ন্ত্রণ করুন
  6. মডিউল

ঘোষণা শৈলী

Var

ঘোষিত শনাক্তকারীদের 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

ইন 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]]ফাংশন-অবজেক্টের মানটি অনুলিপি করে নতুন এক্সিকিউশন প্রসঙ্গে লেক্সিকাল পরিবেশে একটি বহিরাগত রেফারেন্স ফিল্ডে অনুলিপি করে এটি করে।

নোট করুন যে ফাংশন অবজেক্টের নতুন এক্সিকিউশন কনটেক্সট এবং লেজিকাল পরিবেশের মধ্যে এই লিঙ্কটিকে ক্লোজার বলা হয় ।

সুতরাং, জাভাস্ক্রিপ্টে, বহিরাগত রেফারেন্স দ্বারা "চেইন" এর সাথে যুক্ত লিক্সিকাল পরিবেশের মাধ্যমে স্কোপটি প্রয়োগ করা হয়। লেজিকাল পরিবেশের এই শৃঙ্খলাটিকে স্কোপ চেইন বলা হয়, এবং সনাক্তকারী রেজোলিউশনটি ম্যাচিং আইডেন্টিফায়ারারের জন্য শৃঙ্খলে অনুসন্ধান করে ঘটে ।

আরও জানতে ।


280
এমনকি বিস্তৃত হওয়ার খুব কাছাকাছি নয়, তবে এটি সম্ভবত জাভাস্ক্রিপ্ট স্কোপ ট্রিক্সগুলির অবশ্যই জেনে রাখা সেটগুলি আধুনিক জাভাস্ক্রিপ্টটি কার্যকরভাবে পড়তে হবে।
ট্রিপটিচ

148
একটি উচ্চ রেটযুক্ত উত্তর, কেন তা নিশ্চিত নয়। এটি যথাযথ ব্যাখ্যা ছাড়াই কেবল উদাহরণগুলির একগুচ্ছ, তারপরে প্রোটোটাইপ উত্তরাধিকারকে (অর্থাত্ সম্পত্তি সমাধান) স্কোপ চেইনে (যেমন পরিবর্তনশীল রেজোলিউশন) বিভ্রান্ত করে। সুযোগ এবং সম্পত্তি রেজোলিউশনের একটি বিস্তৃত (এবং নির্ভুল) ব্যাখ্যা কমপ্লেং.জ্যাভাস্ক্রিপ্ট এফএকিউ নোটগুলিতে
রবজি

108
@ রবজি এটি অত্যন্ত রেট করা হয়েছে কারণ এটি বিভিন্ন প্রোগ্রামার, মাইনর ক্যাচারেসিস সত্ত্বেও দরকারী এবং বোধগম্য। আপনি যে লিঙ্কটি পোস্ট করেছেন তা কিছু পেশাদারদের পক্ষে কার্যকর হলেও আজ জাভাস্ক্রিপ্ট লেখার বেশিরভাগ লোকের কাছে বোধগম্য নয়। উত্তরটি সম্পাদনা করে যেকোন নামকরণ সমস্যা সমাধান করতে নির্দ্বিধায়।
ট্রিপটিচ

7
@ ট্রিপটিচ — আমি কেবল ছোটখাটো জিনিস ঠিক করতে উত্তরগুলি সম্পাদনা করি, প্রধান নয়। "স্কোপ" কে "সম্পত্তি" এ পরিবর্তন করা ত্রুটিটি ঠিক করে দেবে, তবে খুব স্পষ্ট পার্থক্য ছাড়াই উত্তরাধিকার এবং সুযোগের মিশ্রণের বিষয়টি নয়।
রবজি

24
আপনি যদি বাহ্যিক স্কোপে কোনও ভেরিয়েবলকে সংজ্ঞায়িত করেন এবং তারপরে একটি if স্টেটমেন্ট একই ফাংশনের অভ্যন্তরে একটি ভেরিয়েবলকে সংজ্ঞায়িত করে, এমনকি যদি শাখাটি না পৌঁছায় তবে এটি পুনরায় সংজ্ঞায়িত হয়। একটি উদাহরণ - jsfiddle.net/3CxVm
ক্রিস এস

233

জাভাস্ক্রিপ্ট কোনও প্রদত্ত ফাংশনের সুযোগ স্থাপনের জন্য স্কোপ চেইন ব্যবহার করে। সাধারণত একটি বৈশ্বিক সুযোগ থাকে এবং সংজ্ঞায়িত প্রতিটি ফাংশনের নিজস্ব নেস্টেড সুযোগ থাকে। অন্য ফাংশনের মধ্যে সংজ্ঞায়িত যে কোনও ফাংশনের একটি স্থানীয় সুযোগ রয়েছে যা বাইরের ফাংশনের সাথে যুক্ত। এটি সর্বদা উত্সের অবস্থান যা স্কোপটি সংজ্ঞায়িত করে।

স্কোপ চেইনের একটি উপাদান মূলত একটি মূল মানচিত্র যার প্যারেন্ট স্কোপের একটি পয়েন্টার রয়েছে।

কোনও ভেরিয়েবলের সমাধান করার সময়, জাভাস্ক্রিপ্ট অভ্যন্তরীণ স্কোপ থেকে শুরু হয় এবং বাইরে দিকে অনুসন্ধান করে।


1
স্কোপ চেইনগুলি [স্মৃতি] বন্ধকরণের জন্য আরেকটি শব্দ ... এখানে পড়া পাঠকদের জাভাস্ক্রিপ্টে শিখতে / পড়তে।
নিউ আলেকজান্দ্রিয়া

108

বিশ্বব্যাপী ঘোষিত ভেরিয়েবলগুলির একটি বৈশ্বিক সুযোগ রয়েছে। কোনও ফাংশনের মধ্যে ঘোষিত ভেরিয়েবলগুলি সেই ফাংশনে স্কোপ করা হয় এবং একই নামের ছায়া গোষ্ঠী পরিবর্তনশীল।

(আমি নিশ্চিত যে এমন অনেকগুলি সূক্ষ্মতা রয়েছে যা প্রকৃত জাভাস্ক্রিপ্ট প্রোগ্রামাররা অন্যান্য উত্তরে উল্লেখ করতে সক্ষম হবে particular বিশেষত আমি এই পৃষ্ঠাটি জুড়ে এসেছি সঠিক thisসময়ে যে কোনও সময় যা বোঝায়। আশা করি এই প্রারম্ভিক লিঙ্কটি আপনাকে শুরু করার জন্য যথেষ্ট যদিও আশা করি ।)


7
আমি এই প্রশ্নের উত্তর দেওয়া শুরু করতেও ভয় পাচ্ছি। রিয়েল জাভাস্ক্রিপ্ট প্রোগ্রামার হিসাবে, আমি জানি যে উত্তর কীভাবে হাতছাড়া হতে পারে। ভাল নিবন্ধ।
ট্রিপটিচ

10
@ ট্রিপটিচ: জিনিসগুলি হাতছাড়া হয়ে যাওয়া সম্পর্কে আপনি কী বোঝাতে চেয়েছেন তা আমি জানি তবে যাইহোক দয়া করে একটি উত্তর যুক্ত করুন। মাত্র দু'টি অনুসন্ধান করেই আমি উপরেরটি পেয়েছি ... প্রকৃত অভিজ্ঞতার সাথে কারও লেখা একটি উত্তর আরও ভাল হতে বাধ্য । দয়া করে আমার যে কোনও উত্তর সংশোধন করুন যা অবশ্যই ভুল!
জন স্কিটি

4
স্ট্যাক ওভারফ্লোতে আমার সর্বাধিক জনপ্রিয় উত্তরের জন্য কোনওভাবে জোন স্কিট দায়বদ্ধ।
ট্রিপটিচ

75

পুরানো স্কুল জাভাস্ক্রিপ্ট

Ditionতিহ্যগতভাবে, জাভাস্ক্রিপ্টের সত্যই কেবল দুটি ধরণের সুযোগ রয়েছে:

  1. গ্লোবাল স্কোপ : ভেরিয়েবলগুলি অ্যাপ্লিকেশন (*) থেকে শুরু করে অ্যাপ্লিকেশন জুড়েই পরিচিত
  2. কার্যকরী সুযোগ : চলকগুলি ফাংশনটির শুরু থেকে (*) ঘোষিত ফাংশনের মধ্যেই পরিচিত হয় (*)

আমি এর সাথে আরও বিস্তারিত জানাব না, যেহেতু ইতিমধ্যে আরও অনেক উত্তর রয়েছে যা পার্থক্যটি ব্যাখ্যা করছে।


আধুনিক জাভাস্ক্রিপ্ট

সাম্প্রতিকতম জাভাস্ক্রিপ্ট চশমা এখন তৃতীয় সুযোগ অনুমতি দিতে:

  1. ব্লক স্কোপ : শনাক্তকারীরা তাদের মধ্যে ঘোষিত সুযোগের শীর্ষস্থান থেকে "পরিচিত" হয় তবে তাদের ঘোষণার রেখার পরে অবধি তাদের অর্পণ করা যায় না বা পড়া (পড়া) করা যায় না। এই অন্তর্বর্তীকালকে "অস্থায়ী মৃত অঞ্চল" বলা হয়।

আমি কীভাবে ব্লক স্কোপ ভেরিয়েবলগুলি তৈরি করব?

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করে না:

    • ইন্টারনেট এক্সপ্লোরার 10 এবং নীচে
    • ফায়ারফক্স 43 এবং নীচে
    • সাফারি 9 এবং নীচে
    • অ্যান্ড্রয়েড ব্রাউজার 4 এবং নীচে
    • অপেরা 27 এবং নীচে
    • Chome 40 এবং নীচে
    • অপেরা মিনি এবং ব্ল্যাকবেরি ব্রাউজারের কোনও সংস্করণ

এখানে চিত্র বর্ণনা লিখুন


কিভাবে ব্রাউজার সমর্থন ট্র্যাক রাখা

letআপনার উত্তরটি পড়ার সময় কোন ব্রাউজারগুলি বিবৃতিটিকে সমর্থন করে তার একটি আপ-টু-ডেট ওভিউর জন্য , এই Can I Useপৃষ্ঠাটি দেখুন


(*) বিশ্বব্যাপী এবং কার্যকরীভাবে স্কোপযুক্ত ভেরিয়েবলগুলি জাভাস্ক্রিপ্ট ভেরিয়েবলগুলি উত্তোলন করার কারণে তাদের ঘোষণার আগেই তা আরম্ভ করা যেতে পারে এবং ব্যবহার করা যেতে পারে । এর অর্থ হল যে ঘোষণাগুলি সর্বদা সুযোগের শীর্ষে থাকে to


2
"এটি পরিচিত নয়" বিভ্রান্তিমূলক, কারণ সেখানে উত্তোলনের কারণে ভেরিয়েবলটি ঘোষিত হয়েছে।
অরিওল

উপরের উদাহরণটি বিভ্রান্তিমূলক, ভেরিয়েবল 'আই' এবং 'জ' ব্লকের বাইরে জানা যায় না। 'লেট' ভেরিয়েবলগুলির কেবলমাত্র সেই নির্দিষ্ট ব্লকে ব্লকের বাইরে নয় scope আসুন এর অন্যান্য সুবিধাগুলিও থাকুন, আপনি আবার পরিবর্তনশীলটিকে পুনরায় ঘোষণা করতে পারবেন না এবং এটি লেজিকাল স্কোপটি ধারণ করে।
জাকির

1
এটি সহায়ক ছিল, ধন্যবাদ! আমি মনে করি আপনি "আধুনিক জাভাস্ক্রিপ্ট" এবং "ওল্ড স্কুল জাভাস্ক্রিপ্ট" বলতে যা বোঝায় সে সম্পর্কে সুনির্দিষ্ট হওয়া আরও বেশি সহায়ক হবে; আমার মনে হয় এগুলি যথাক্রমে ECMAScript 6 / ES6 / ECMAScript 2015 এর সাথে এবং পূর্ববর্তী সংস্করণগুলির সাথে যথাযথ?
জন স্নাইডার

1
@ জনস্কিনিডার: সঠিক! যেখানে আমি "পুরাতন স্কুল জাভাস্ক্রিপ্ট" বলি, আমি ইসিএমএসক্রিপ্ট 5 সম্পর্কে কথা বলি এবং যেখানে আমি "আধুনিক জাভাস্ক্রিপ্ট" উল্লেখ করছি, আমি ECMAScript 6 (ওরফে ECMAScript 2015) গ্রহণ করছি। আমি এখানে বিশদে যাওয়া সত্যিই গুরুত্বপূর্ণ মনে করি নি, যদিও, বেশিরভাগ লোকেরা কেবল (1) জানতে চান যে ব্লক স্কোপ এবং কার্যকরী সুযোগের মধ্যে পার্থক্য কী, (২) ব্রাউজারগুলি ব্লক স্কোপ সমর্থন করে এবং (3) তারা যে প্রকল্পে কাজ করছে তার জন্য আজকে ব্লক স্কোপ ব্যবহার করা নিরাপদ কিনা। তাই আমি এই উত্তরগুলি সমাধান করার জন্য আমার উত্তরকে কেন্দ্র করেছিলাম।
জন স্লেজার

1
@ জনস্কিনিডার: (অব্যাহত) তবুও, আমি যারা গত কয়েক বছর ধরে জাভাস্ক্রিপ্টে কোন বৈশিষ্ট্যগুলি যুক্ত করা হয়েছে সে সম্পর্কে আরও জানতে চাই যারা তাদের জন্য ES6 / ES2015 এর একটি স্ম্যাশিং ম্যাগাজিন নিবন্ধের একটি লিঙ্ক যুক্ত করেছি ... অন্য যে কেউ "আধুনিক জাভাস্ক্রিপ্ট" দিয়ে আমি কী বোঝাতে চাইছি তা ভাবতে পারে।
জন স্লেজার

39

এখানে একটি উদাহরণ:

<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>

আপনি ক্লোজারগুলি এবং কীভাবে ব্যক্তিগত সদস্য তৈরি করতে সেগুলি ব্যবহার করবেন তা তদন্ত করতে চাইবেন ।



26

"জাভাস্ক্রিপ্ট ১.7" (মোজিলার জাভাস্ক্রিপ্টে প্রসারিত) -এর মধ্যেও কেউ letবিবৃতি সহ ব্লক-স্কোপ ভেরিয়েবল ঘোষণা করতে পারে :

 var a = 4;
 let (a = 3) {
   alert(a); // 3
 }
 alert(a);   // 4

2
হ্যাঁ, তবে এটি কি নিরাপদ? আমি বোঝাতে চাইছি আমার কোডটি ওয়েবকিটে চালিত হলে আমি বাস্তবায়ন কি এই বাস্তবায়নটি বেছে নেব?
ইগোরগানাপলস্কি

10
@ পাইথন: না, ওয়েবকিট সমর্থন করে না let
কেনেটিএম

আমি অনুমান করি এর একমাত্র বৈধ ব্যবহার হ'ল যদি আপনি জানতেন যে সমস্ত ক্লায়েন্টরা কোনও সংস্থার অভ্যন্তরীণ সিস্টেমের মতো একটি মজিলা ব্রাউজার ব্যবহার করবে।
GazB

অথবা আপনি যদি এক্সএলএল ফ্রেমওয়ার্ক ব্যবহার করে প্রোগ্রামিং করছেন, মজিলার ইন্টারফেস ফ্রেমওয়ার্ক যেখানে আপনি সিএসএস, এক্সএমএল এবং জাভাস্ক্রিপ্ট ব্যবহার করে তৈরি করেন।
জেরার্ড ওনিল

1
@ গ্যাজবি এমনকি এটি একটি ভয়াবহ ধারণা! সুতরাং আজ আপনি জানেন যে আপনার ক্লায়েন্টরা মজিলা ব্যবহার করছে তারপরে একটি নতুন মেমো এসেছে যা জানিয়েছে যে তারা এখন অন্য কিছু ব্যবহার করছে। আমাদের এই বেতন সিস্টেমটি
সফলভাবে চালিত

25

যখন মূলত দ্বারা ডিজাইন জাভাস্ক্রিপ্ট মধ্যে scoping ধারণা ব্রেন্ডন Eich থেকে এসেছিলেন হাইপারকার্ড স্ক্রিপ্টিং ভাষা HyperTalk

এই ভাষায়, প্রদর্শনগুলি সূচক কার্ডগুলির একটি স্ট্যাকের মতোই হয়েছিল। পটভূমি হিসাবে উল্লেখ করা একটি মাস্টার কার্ড ছিল। এটি স্বচ্ছ ছিল এবং নীচের কার্ড হিসাবে দেখা যেতে পারে। এই বেস কার্ডের যে কোনও বিষয়বস্তু এর উপরে থাকা কার্ডগুলির সাথে ভাগ করা হয়েছিল। শীর্ষে রাখা প্রতিটি কার্ডের নিজস্ব সামগ্রী রয়েছে যা পূর্ববর্তী কার্ডের চেয়ে বেশি প্রাধান্য পেয়েছিল, তবে ইচ্ছা করলে পূর্বের কার্ডগুলিতে অ্যাক্সেস ছিল।

ঠিক এভাবেই জাভাস্ক্রিপ্ট স্কোপিং সিস্টেমটি ডিজাইন করা হয়েছে। এটির বিভিন্ন নাম রয়েছে। জাভাস্ক্রিপ্টের কার্ডগুলি এক্সিকিউশন কনটেক্সটস ইসিএমএ হিসাবে পরিচিত । এগুলির প্রতিটি প্রসঙ্গে তিনটি প্রধান অংশ রয়েছে। একটি পরিবর্তনশীল পরিবেশ, একটি লেজিকাল পরিবেশ এবং এটি একটি বাধ্যতামূলক। কার্ডের রেফারেন্সে ফিরে যাওয়া, লেজিকাল পরিবেশে স্ট্যাকের নীচে থাকা পূর্ববর্তী কার্ডগুলি থেকে সমস্ত সামগ্রী থাকে। বর্তমান প্রসঙ্গটি স্ট্যাকের শীর্ষে এবং সেখানে ঘোষিত যে কোনও বিষয়বস্তু পরিবর্তনশীল পরিবেশে সংরক্ষণ করা হবে। নামকরণ সংঘর্ষের ক্ষেত্রে পরিবর্তনশীল পরিবেশ অগ্রাধিকার গ্রহণ করবে।

এই বাঁধাইটি অন্তর্ভুক্ত বস্তুকে নির্দেশ করবে। কখনও কখনও স্কোপ বা এক্সিকিউশন কনটেক্সটগুলি ধারণকৃত অবজেক্ট পরিবর্তন না করে পরিবর্তিত হয়, যেমন একটি ঘোষিত ফাংশনে যেখানে ধারণকৃত বস্তুটি হতে পারে windowবা কনস্ট্রাক্টর ফাংশন।

এই নির্বাহের প্রসঙ্গগুলি তৈরি করা হয় যে কোনও সময় নিয়ন্ত্রণ স্থানান্তরিত হয়। কোডটি কার্যকর করা শুরু হলে নিয়ন্ত্রণ স্থানান্তরিত হয় এবং এটি মূলত ফাংশন সম্পাদন থেকে করা হয়।

সুতরাং এটি প্রযুক্তিগত ব্যাখ্যা। অনুশীলনে, এটি জাভাস্ক্রিপ্টে মনে রাখা গুরুত্বপূর্ণ

  • স্কোপগুলি প্রযুক্তিগতভাবে "এক্সিকিউশন কনটেক্সটস"
  • প্রসঙ্গগুলি পরিবেশের একটি স্ট্যাক গঠন করে যেখানে ভেরিয়েবলগুলি সংরক্ষণ করা হয়
  • স্ট্যাকের শীর্ষটি অগ্রাধিকার নেয় (নীচের অংশটি বিশ্বব্যাপী প্রেক্ষাপট)
  • প্রতিটি ফাংশন একটি সম্পাদন প্রসঙ্গ তৈরি করে (তবে সর্বদা এটি নতুনভাবে আবশ্যক নয়)

এই পৃষ্ঠায় পূর্ববর্তী উদাহরণগুলির মধ্যে একটিতে (5 "বন্ধকরণ") প্রয়োগ করে মৃত্যুদণ্ড কার্যকর করার স্ট্যাক অনুসরণ করা সম্ভব। এই উদাহরণে স্ট্যাকটিতে তিনটি প্রসঙ্গ রয়েছে। এগুলি বাহ্যিক প্রসঙ্গ, ভের ছ দ্বারা আহ্বানিত তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশনটির প্রসঙ্গ এবং ভের ছয়ের তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশনের অভ্যন্তরে ফিরে আসা ক্রিয়ায় প্রসঙ্গ দ্বারা সংজ্ঞায়িত হয়।

i ) বাইরের প্রসঙ্গ এটির একটি পরিবর্তনশীল পরিবেশ রয়েছে = 1
ii ) IIFE প্রসঙ্গে, এটির একটি = 1 এর লেজিকাল পরিবেশ রয়েছে, তবে একটি = 6 এর একটি পরিবর্তনশীল পরিবেশ যা স্ট্যাকের মধ্যে অগ্রাধিকার গ্রহণ করে
iii ) ফিরে আসা ফাংশন প্রসঙ্গে, এটি একটি লেক্সিকাল আছে a = 6 এর পরিবেশ এবং কল করার সময় এটি সতর্কতার সাথে উল্লেখযোগ্য মান।

এখানে চিত্র বর্ণনা লিখুন


17

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 একমাত্র ফর্ম যে , এবং তাদের ডেরাইভেটিভগুলি সহ), তবে হোস্ট পরিবেশের স্কোপিংয়ের বিভিন্ন ধারণা রয়েছে - উদাহরণস্বরূপ ব্রাউজার এবং নোডজেএস এর ভিএম মডিউলের ইনলাইন ইভেন্টগুলি।
বেনিয়ামিন গ্রুইনবাউম

বেনজামিন - আমি যা দেখতে পাচ্ছি তা থেকে এবং উভয়ই কেবল বর্তমান ক্ষেত্রের (এবং এইভাবে বৈশিষ্ট্যগুলিতে) পরিচয় করিয়ে দেয় তবে তারপরে ব্লকটি শেষ হওয়ার পরে, ভেরিয়েবলগুলি পুনরায় সেট করা হয়। তবে উদাহরণস্বরূপ, একটি ক্যাচে প্রবর্তন করা একটি নতুন ভেরিয়েবলের বদ্ধ কর্ম / পদ্ধতির সুযোগ থাকবে।
জেরার্ড ওনিল

2
ব্লক স্কোপিংয়ের অর্থ হ'ল :)
বেনজমিন গ্রুয়েনবুম

9

আমি দেখতে পেয়েছি যে জাভাস্ক্রিপ্টে নতুন অনেকেরই বুঝতে সমস্যা হয় যে উত্তরাধিকারটি ডিফল্টরূপে ভাষাতে উপলব্ধ এবং সেই ফাংশনের সুযোগটি এখন পর্যন্ত একমাত্র সুযোগ scope আমি জেএসপ্রেটি নামে গত বছরের শেষে লিখেছি এমন একটি বিউটিফায়ারকে একটি এক্সটেনশন সরবরাহ করেছি। বৈশিষ্ট্যটি কোডটিতে রঙের স্কোপকে রঙ করে এবং সর্বদা সেই সুযোগে ঘোষিত সমস্ত ভেরিয়েবলের সাথে একটি রঙ যুক্ত করে। যখন একটি স্কোপ থেকে বর্ণের সাথে একটি ভেরিয়েবলটি অন্য স্কোপে ব্যবহৃত হয় তখন বন্ধটি দৃশ্যত প্রদর্শিত হয়।

বৈশিষ্ট্যটি এখানে চেষ্টা করুন:

একটি ডেমো এখানে দেখুন:

কোডটি এখানে দেখুন:

বর্তমানে বৈশিষ্ট্যটি 16 টি নেস্টেড ফাংশনগুলির গভীরতার জন্য সমর্থন সরবরাহ করে তবে বর্তমানে বৈশ্বিক ভেরিয়েবলগুলিকে রঙ দেয় না।


1
ফায়ারফক্স 26 দিয়ে আমার জন্য কাজ করে না I আমি কোড পেস্ট করি বা একটি ফাইল লোড করি, সম্পাদন ক্লিক করুন এবং কিছুই ঘটে না।
এমপিএলওয়ার্ক

সুযোগ এবং উত্তরাধিকার দুটি পার্থক্য জিনিস।
বেন অ্যাস্টন

9

জাভাস্ক্রিপ্টের মাত্র দুটি ধরণের সুযোগ রয়েছে:

  1. গ্লোবাল স্কোপ : গ্লোবাল উইন্ডো স্তরের সুযোগ ছাড়া কিছুই নয় e এখানে, অ্যাপ্লিকেশন জুড়ে চলক উপস্থিত present
  2. কার্যকরী সুযোগ : মূলশব্দ সহ কোনও ফাংশনের মধ্যে ঘোষিত চলকটির varকার্যকরী সুযোগ রয়েছে।

যখনই কোনও ফাংশন বলা হয়, একটি ভেরিয়েবল স্কোপ অবজেক্ট তৈরি হয় (এবং স্কোপ চেইনে অন্তর্ভুক্ত) যা জাভাস্ক্রিপ্টে ভেরিয়েবল অনুসরণ করে।

        a = "global";
         function outer(){ 
              b = "local";
              console.log(a+b); //"globallocal"
         }
outer();

স্কোপ চেইন ->

  1. উইন্ডো স্তর - aএবং outerফাংশন স্কোপ চেইনে শীর্ষ স্তরে রয়েছে।
  2. যখন বাইরের ফাংশনটি একটি নতুন নামে পরিচিত হয় variable scope object(এবং স্কোপ চেইনে অন্তর্ভুক্ত থাকে) এর bভিতরে ভেরিয়েবল যুক্ত হয় ।

এখন যখন কোনও ভেরিয়েবলের aপ্রয়োজন হয় এটি প্রথমে নিকটতম ভেরিয়েবল স্কোপটি অনুসন্ধান করে এবং যদি ভেরিয়েবলটি তার পরিবর্তে ভেরিয়েবল স্কোপ চেইনের পরবর্তী বস্তুতে সরিয়ে না দেয়। যা এই ক্ষেত্রে উইন্ডো স্তর।


1
কেন এটি গ্রহণযোগ্য উত্তর নয় তা নিশ্চিত নন। প্রকৃতপক্ষে কেবল কার্যকরী সুযোগ রয়েছে (ইসিএমএ 6 এর আগে "স্থানীয় সুযোগ" ছিল না) এবং বিশ্বব্যাপী বাইন্ডিংস
টেক্সাসব্রুস

9

কেবলমাত্র অন্য উত্তরগুলিতে যোগ করার জন্য, সুযোগ হ'ল সমস্ত ঘোষিত শনাক্তকারী (ভেরিয়েবল) এর একটি তালিকা-এর তালিকা এবং বর্তমানে এটি সম্পাদনকারী কোডে কীভাবে এগুলি অ্যাক্সেসযোগ্য তা নিয়ে একটি কঠোর নিয়মের প্রয়োগ করে। এই চেহারাটি ভেরিয়েবলকে নির্ধারণের উদ্দেশ্যে হতে পারে, যা এলএইচএস (বাম দিকের দিকের) রেফারেন্স, বা এটির মান পুনরুদ্ধারের উদ্দেশ্যে হতে পারে, যা একটি আরএইচএস (ডানদিকে-পাশ) রেফারেন্স। কোডগুলি সংকলন ও সম্পাদন করার সময় জাভাস্ক্রিপ্ট ইঞ্জিন অভ্যন্তরীণভাবে যা করছে তা এই চেহারাগুলি।

সুতরাং এই দৃষ্টিকোণ থেকে, আমি মনে করি যে কাইল সিম্পসন-এর স্কোপস এবং ক্লোজার্স ইবুক-এ পাওয়া একটি ছবি আমাকে সহায়তা করবে:

ভাবমূর্তি

তাঁর ইবুক থেকে উদ্ধৃতি:

বিল্ডিংটি আমাদের প্রোগ্রামের নেস্টেড স্কোপ রুলসেট উপস্থাপন করে। বিল্ডিংয়ের প্রথম তলটি আপনি বর্তমানে যেখানেই থাকুন না কেন আপনার বর্তমানে সম্পাদন করার সুযোগটি উপস্থাপন করে। বিল্ডিংয়ের শীর্ষ স্তরটি বিশ্বব্যাপী scope আপনি আপনার বর্তমান মেঝেটি দেখে এলএইচএস এবং আরএইচএসের রেফারেন্সগুলি সমাধান করেন এবং যদি এটি খুঁজে না পান তবে লিফটটি পরবর্তী তলায় নিয়ে যান, সেখানে তাকান, তার পরেরটি এবং আরও অনেক কিছু। একবার আপনি উপরের তলায় (বৈশ্বিক সুযোগ) এ পৌঁছে গেলে আপনি যা সন্ধান করছেন তা পেয়ে যাবেন, বা আপনি পাবেন না। তবে আপনাকে নির্বিশেষে থামতে হবে।

একটি বিষয় লক্ষণীয় যে, "প্রথম ম্যাচটি খুঁজে পাওয়ার পরে স্কোপ লুক আপ বন্ধ হয়ে যায়"।

"স্কোপ স্তরের" এই ধারণাটি ব্যাখ্যা করে যে কেন এটি "নতুন" তৈরি করা স্কোপ দিয়ে "এটি" পরিবর্তন করা যেতে পারে, যদি এটি কোনও নেস্টেড ফাংশনে দেখা হয়। এখানে একটি লিঙ্ক রয়েছে যা জাভাস্ক্রিপ্টের সুযোগ সম্পর্কে আপনি জানতে চেয়েছিলেন , এই সমস্ত বিবরণে যায়


8

কোড চালান। আশা করি এটি স্কোপিং সম্পর্কে ধারণা দেবে

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);

8

গ্লোবাল স্কোপ:

গ্লোবাল ভেরিয়েবলগুলি হুবহু গ্লোবাল তারার মতো (জ্যাকি চ্যান, নেলসন ম্যান্ডেলা)। আপনার অ্যাপ্লিকেশনটির যে কোনও অংশ থেকে আপনি এগুলি অ্যাক্সেস করতে পারেন (মানটি নির্ধারণ করুন বা সেট করুন)। গ্লোবাল ফাংশনগুলি বিশ্বব্যাপী ইভেন্টগুলির মতো (নতুন বছর, ক্রিসমাস)। আপনি আপনার অ্যাপ্লিকেশনটির যে কোনও অংশ থেকে তাদের সম্পাদন (কল) করতে পারেন।

//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    

সুযোগের গভীরতা বোঝার জন্য এই নিবন্ধটি দেখুন


6

এখানে মাত্র দুটি ধরণের জাভাস্ক্রিপ্ট স্কোপ রয়েছে:

  • প্রতিটি ভেরি ঘোষণার সুযোগটি সর্বাধিক তাত্ক্ষণিকভাবে বদ্ধ কর্মের সাথে সম্পর্কিত
  • যদি কোনও বৈকল্পিক ঘোষণার জন্য কোনও সংযুক্তকরণের ক্রিয়া না থাকে তবে এটি বিশ্বব্যাপী সুযোগ

সুতরাং, ফাংশন ব্যতীত অন্য কোনও ব্লক একটি নতুন সুযোগ তৈরি করে না। এটি ব্যাখ্যা করে যে কেন লুপগুলি বাইরের স্কোপযুক্ত ভেরিয়েবলগুলি ওভাররাইট করে:

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

প্রথম উদাহরণে, কোনও ব্লকের সুযোগ ছিল না, তাই প্রাথমিকভাবে ঘোষিত ভেরিয়েবলগুলি ওভাররাইট করা হয়েছিল। দ্বিতীয় উদাহরণে, ফাংশনটির কারণে একটি নতুন সুযোগ ছিল, সুতরাং প্রাথমিকভাবে ঘোষিত ভেরিয়েবলগুলি ছায়াযুক্ত ছিল, এবং ওভাররাইট নয়।

জাভাস্ক্রিপ্টের স্কোপিংয়ের ক্ষেত্রে আপনার যা জানা দরকার তা বাদে:

  • ব্যতিক্রমী ভেরিয়েবলের জন্য কেবল নতুন সুযোগ প্রবর্তনের চেষ্টা করুন / ধরুন, অন্যান্য ভেরিয়েবলের নতুন সুযোগ নেই
  • স্পষ্টতই-ক্লজটি হ'ল একটি ব্যতিক্রম, তবে-ক্লজটি ব্যবহার করে এটি অত্যন্ত নিরুৎসাহিত হয়েছে ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Statements/with )

সুতরাং আপনি দেখতে পাচ্ছেন যে জাভাস্ক্রিপ্টের স্কোপিং আসলে খুব সহজ, যদিও এটি সর্বদা স্বজ্ঞাত নয়। সচেতন হওয়ার জন্য কয়েকটি বিষয়:

  • var ঘোষণাগুলি সুযোগের শীর্ষে উত্তোলন করা হয়। এর অর্থ হ'ল ভেরি ডিক্লেয়ারেশন যেখানেই ঘটুক না কেন, কম্পাইলারের কাছে এটি হ'ল ভারে নিজেই শীর্ষে ঘটেছে
  • একই ক্ষেত্রের মধ্যে একাধিক var ঘোষণা একত্রিত হয় combined

সুতরাং এই কোড:

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);

এটি পাল্টা স্বজ্ঞাত মনে হতে পারে, তবে এটি একটি অত্যাবশ্যক ভাষা ডিজাইনারের দৃষ্টিকোণ থেকে বোঝা যায়।


5

আধুনিক জেএস, ES6 +, ' const' এবং ' let'

অন্যান্য অন্যান্য প্রধান ভাষার মতো আপনার তৈরি প্রতিটি ভেরিয়েবলের জন্য আপনার ব্লক স্কোপিং ব্যবহার করা উচিত। varহয় অপ্রচলিত । এটি আপনার কোডটিকে নিরাপদ এবং আরও রক্ষণাবেক্ষণযোগ্য করে তোলে।

const95% ক্ষেত্রে ব্যবহার করা উচিত । এটি এটিকে এমন করে তোলে যাতে পরিবর্তনশীল উল্লেখটি পরিবর্তন করতে পারে না change অ্যারে, অবজেক্ট এবং ডোম নোডের বৈশিষ্ট্যগুলি পরিবর্তিত হতে পারে এবং সম্ভবত এটি হওয়া উচিত const

letপুনরায় নিয়োগের প্রত্যাশায় যে কোনও ভেরিয়েবলের জন্য ব্যবহার করা উচিত। এটি একটি for লুপের মধ্যে অন্তর্ভুক্ত। আপনি যদি কখনও আরম্ভের বাইরে মান পরিবর্তন করেন তবে ব্যবহার করুন let

ব্লক স্কোপটির অর্থ হল যে ভেরিয়েবলটি কেবলমাত্র বন্ধনীগুলির মধ্যে এটি ঘোষিত হয় এর মধ্যে উপলব্ধ। এটি আপনার ক্ষেত্রের মধ্যে তৈরি অজ্ঞাতনামা ফাংশন সহ অভ্যন্তরীণ স্কোপগুলিতে প্রসারিত।


3

এই কৌতূহল উদাহরণ চেষ্টা করুন। নীচের উদাহরণে যদি একটি 0 তে সংখ্যার সূচনা হয়, আপনি 0 এবং তারপরে দেখতে পাবেন 1 টি বাদে একটি অবজেক্ট এবং জাভাস্ক্রিপ্ট এর অনুলিপি না হয়ে f1 এর পয়েন্টারটি পাস করবে। ফলাফল আপনি উভয় একই সতর্কতা পেতে।

var a = new Date();
function f1(b)
{
    b.setDate(b.getDate()+1);
    alert(b.getDate());
}
f1(a);
alert(a.getDate());

3

জেএসে কেবলমাত্র ফাংশন স্কোপ রয়েছে। স্কোপ ব্লক নয়! আপনি কী উত্তোলন করছেন তা দেখতে পাবেন।

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);

(উত্তর পোস্ট হওয়ার পরে দীর্ঘ সময়) অবরুদ্ধ সুযোগ; বিকাশকারী.মোজিলা.আর.ইন
বব

2

আমার উপলব্ধিটি হল যে এখানে 3 টি স্কোপ রয়েছে: বিশ্বব্যাপী সুযোগ, বিশ্বব্যাপী উপলব্ধ; স্থানীয় সুযোগ, ব্লক নির্বিশেষে একটি সম্পূর্ণ ফাংশন উপলভ্য; এবং ব্লক স্কোপ, কেবল এটির জন্য ব্যবহৃত ব্লক, বিবৃতি, বা প্রকাশের জন্য উপলব্ধ। গ্লোবাল এবং লোকাল স্কোপটি 'ভ্যার' কীওয়ার্ড দিয়ে চিহ্নিত করা হয়, হয় কোনও ফাংশনের মধ্যে বা বাইরে, এবং ব্লক স্কোপটি 'লেট' কীওয়ার্ড দ্বারা নির্দেশিত হয়।

যারা বিশ্বাস করেন যে কেবলমাত্র বিশ্বব্যাপী এবং স্থানীয় সুযোগ রয়েছে, দয়া করে ব্যাখ্যা করুন কেন মোজিলার জেএসে ব্লক স্কোপের সংক্ষিপ্তসারগুলি বর্ণনা করার জন্য একটি সম্পূর্ণ পৃষ্ঠা থাকবে।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let


2

এখনও খুব সাধারণ সমস্যা বর্ণিত হয়নি যে ফ্রন্ট-এন্ড কোডারগুলি প্রায়শই সঞ্চালিত হয় সেটি হ'ল এইচটিএমএলে একটি ইনলাইন ইভেন্ট হ্যান্ডলারের কাছে দৃশ্যমান - উদাহরণস্বরূপ,

<button onclick="foo()"></button>

কোনও on*অ্যাট্রিবিউট রেফারেন্স করতে পারে এমন ভেরিয়েবলের সুযোগটি অবশ্যই হ'ল:

  • গ্লোবাল (কার্যত ইনলাইন হ্যান্ডলারগুলি প্রায়শই গ্লোবাল ভেরিয়েবলগুলি উল্লেখ করে)
  • দস্তাবেজের একটি সম্পত্তি (যেমন, querySelectorস্বতন্ত্র ভেরিয়েবল হিসাবে চিহ্নিত হবে document.querySelector; বিরল)
  • হ্যান্ডলার সংযুক্ত উপাদানটির একটি সম্পত্তি (উপরে যেমন; বিরল)

অন্যথায়, হ্যান্ডলারটি চাওয়া হলে আপনি একটি রেফারেন্সআরআর পাবেন। সুতরাং, উদাহরণস্বরূপ, যদি ইনলাইন হ্যান্ডলারটি এমন কোনও ফাংশনকে উল্লেখ করে যা ভিতরে সংজ্ঞায়িত করা হয় window.onloadবা $(function() {, তবে রেফারেন্স ব্যর্থ হবে, কারণ ইনলাইন হ্যান্ডলারটি কেবল বৈশ্বিক স্কোপগুলিতে পরিবর্তনকে উল্লেখ করতে পারে এবং ফাংশনটি বিশ্বব্যাপী নয়:

এর প্রোপার্টি documentএবং উপাদান হ্যান্ডলার করার সময় ইনলাইন হ্যান্ডেলার ভিতরে স্বতন্ত্র ভেরিয়েবল যেমন রেফারেন্সড হতে পারে কারণ ইনলাইন হ্যান্ডেলার প্রার্থনা করছে সংযুক্ত করা হয় বৈশিষ্ট্য ভিতরে দুই withব্লক , জন্য এক documentউপাদান জন্য। এই হ্যান্ডলারের অভ্যন্তরে ভেরিয়েবলের স্কোপ চেইনটি অত্যন্ত অপ্রচলিত , এবং একটি কার্যকরী ইভেন্ট হ্যান্ডলারের সম্ভবত বিশ্বব্যাপী হওয়ার জন্য কোনও ফাংশন প্রয়োজন হবে (এবং অপ্রয়োজনীয় বৈশ্বিক দূষণ সম্ভবত এড়ানো উচিত )।

যেহেতু ইনলাইন হ্যান্ডলারের ভিতরে স্কোপ চেইনটি এতটাই অদ্ভুত , এবং যেহেতু ইনলাইন হ্যান্ডলারগুলি কাজ করার জন্য বিশ্বব্যাপী দূষণের প্রয়োজন, এবং যেহেতু ইনলাইন হ্যান্ডলারগুলি মাঝে মধ্যে তর্কগুলি পাস করার সময় কুশ্রী স্ট্রিং পলায়নের প্রয়োজন হয়, তাই সম্ভবত এগুলি এড়ানো সহজ। পরিবর্তে, addEventListenerHTML মার্কআপের পরিবর্তে জাভাস্ক্রিপ্ট ব্যবহার করে ইভেন্ট হ্যান্ডলারগুলি সংযুক্ত করুন ।


একটি পৃথক নোটে, সাধারণ <script>ট্যাগগুলির বিপরীতে , যা শীর্ষ স্তরে চলে, ES6 মডিউলগুলির অভ্যন্তর কোডটি তার নিজস্ব স্কোপে চলে। একটি সাধারণ <script>ট্যাগের শীর্ষে সংজ্ঞায়িত একটি পরিবর্তনীয় গ্লোবাল, সুতরাং আপনি অন্যান্য <script>ট্যাগগুলিতে এটি উল্লেখ করতে পারেন , এর মতো:

তবে ES6 মডিউলের শীর্ষ স্তরটি বিশ্বব্যাপী নয় । কোনও ES6 মডিউলের শীর্ষে ঘোষিত একটি চলক কেবলমাত্র সেই মডিউলের অভ্যন্তরে দৃশ্যমান হবে, যদি না ভেরিয়েবলটি সুস্পষ্টভাবে exportসম্পাদনা করা হয়, বা এটি বিশ্বব্যাপী কোনও সামগ্রীর জন্য নির্ধারিত না হয়।

একটি ES6 মডিউলটির শীর্ষ স্তরটি কোনও সাধারণের শীর্ষ স্তরের আইআইএফইয়ের অভ্যন্তরের সাথে সমান <script>। মডিউলটি বিশ্বব্যাপী যে কোনও চলকগুলি উল্লেখ করতে পারে এবং মডিউলটির জন্য স্পষ্টভাবে নকশাকৃত না হলে কিছুই মডিউলটির অভ্যন্তরে কিছুই উল্লেখ করতে পারে না।


1

জাভাস্ক্রিপ্টে দুটি ধরণের সুযোগ রয়েছে:

  • স্থানীয় সুযোগ
  • বিশ্বব্যাপী সুযোগ

নীচের ফাংশনে একটি স্থানীয় স্কোপ ভেরিয়েবল রয়েছে 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 
    }
}

1

ES5 এবং পূর্বে:

জাভাস্ক্রিপ্টের ভেরিয়েবলগুলি প্রাথমিকভাবে (প্রাক ES6) লেক্সিকালি ফাংশন স্কোপড ছিল। লেক্সিকালি স্কোপড শব্দের অর্থ আপনি কোডটি 'তাকিয়ে' দেখিয়ে ভেরিয়েবলের সুযোগ দেখতে পাচ্ছেন।

varকীওয়ার্ড সহ ঘোষিত প্রতিটি ভেরিয়েবল ফাংশনে স্কোপ করা হয়। তবে অন্য ফাংশনটি যদি সেই ফাংশনের মধ্যে ঘোষণা করা হয় তবে সেই ফাংশনগুলির বাইরের ফাংশনের ভেরিয়েবলগুলিতে অ্যাক্সেস থাকবে। একে স্কোপ চেইন বলে । এটি নিম্নলিখিত পদ্ধতিতে কাজ করে:

  1. কোনও ক্রিয়াকলাপটি যখন কোনও ভেরিয়েবলের মান সমাধান করতে দেখায় এটি প্রথমে তার নিজস্ব ক্ষেত্রটি দেখায়। এটি ফাংশন বডি, অর্থাত্ কোঁকড়া বন্ধনী everything between এর মধ্যে সবকিছু ( এই ক্ষেত্রের মধ্যে থাকা অন্যান্য ফাংশনের ভিতরে ভেরিয়েবলগুলি বাদে )।
  2. যদি এটি ফাংশন বডিটির ভিতরে ভেরিয়েবলটি খুঁজে না পায় তবে এটি শৃঙ্খলে উঠে যাবে এবং যেখানে ফাংশনটি সংজ্ঞায়িত হয়েছিল সেখানে ফাংশনের পরিবর্তনশীল সুযোগটি অনুসন্ধান করবে । লেক্সিকাল স্কোপ সহ এটিই বোঝানো হয়, আমরা কোডটিতে দেখতে পারি যেখানে এই ফাংশনটি সংজ্ঞায়িত হয়েছিল এবং সুতরাং কেবল কোডটি দেখে স্কোপ চেইন নির্ধারণ করতে পারি।

উদাহরণ:

// 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কনসোলের নিম্নলিখিত হল:

  1. আমরা কনসোলে foo লগ করার চেষ্টা করি, ফাংশনটির ভিতরেই ফু পাওয়া innerFuncযায়। সুতরাং, foo এর মানটি স্ট্রিংয়ে সমাধান করা হয় innerFunc
  2. আমরা কনসোলে বার লগ করার চেষ্টা করি, ফাংশনের ভিতরেই বারটি খুঁজে পাওয়া যায় না innerFunc। সুতরাং, আমাদের স্কোপ চেইনে আরোহণ করা প্রয়োজন । আমরা প্রথমে বাহ্যিক ফাংশনটি দেখি যেখানে ফাংশনটি innerFuncসংজ্ঞায়িত করা হয়েছিল। এটি ফাংশন outerFunc। সুযোগ outerFuncআমরা যা STRING 'outerFunc' ঝুলিতে পরিবর্তনশীল বার, খুঁজে পেতে পারেন।
  3. ইনোয়ারফঙ্কে ফুবার খুঁজে পাওয়া যায় না। । অতএব, আমাদের স্কোপ চেইনটি আন্তঃফঙ্ক স্কোপে আরোহণ করা দরকার । এটি এখানেও খুঁজে পাওয়া যায় না, আমরা বৈশ্বিক স্কোপ (অর্থাৎ বাইরেরতম স্কোপ) এর আরও একটি স্তরে আরোহণ করি । আমরা এখানে ভেরিয়েবল foobar পাই যা 'গ্লোবাল' স্ট্রিং ধারণ করে। স্কোপ চেইনে আরোহণের পরে যদি এটি ভেরিয়েবলটি না পেত তবে জেএস ইঞ্জিনটি একটি রেফারেন্স এরির ফেলে দেয় ।

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ব্লক স্কোপড। এগুলি তাদের নিজ নিজ ব্লকের বাইরে থাকা বন্ধ করে দেয়, সুতরাং চলকটি যদি ব্লকের বাইরে প্রবেশ করা যায় না।


0

ইকামাস্ক্রিপ্ট 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.
}

0

ইসমাস্ক্রিপ্ট 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

0

আমি গ্রহণযোগ্য উত্তরটি সত্যিই পছন্দ করি তবে আমি এটি যুক্ত করতে চাই:

স্কোপ সমস্ত ঘোষিত শনাক্তকারী (ভেরিয়েবল) এর তালিকা অনুসন্ধান সংগ্রহ করে এবং বজায় রাখে এবং কীভাবে এগুলি বর্তমানে সম্পাদনকারী কোডে অ্যাক্সেসযোগ্য তা সম্পর্কে একটি কঠোর নিয়ম প্রয়োগ করে।

স্কোপটি তাদের সনাক্তকারী নাম দিয়ে ভেরিয়েবলগুলি সন্ধান করার নিয়মের একটি সেট।

  • যদি তাত্ক্ষণিক স্কোপে কোনও পরিবর্তনীয় সন্ধান করতে না পারে তবে ইঞ্জিন পরবর্তী বাইরের বহির্মুখী স্কোপটি সন্ধান করে, যতক্ষণ না পাওয়া পাওয়া যায় বা অবধি বহির্মুখী (ওরফে, গ্লোবাল) স্কোপ পৌঁছানো অবধি অবিরত থাকে।
  • নিয়মের সেট কি এটি নির্ধারণ করে যে কোথায় এবং কীভাবে কোনও ভেরিয়েবল (সনাক্তকারী) সন্ধান করা যেতে পারে। এই চেহারাটি ভেরিয়েবলকে নির্ধারণের উদ্দেশ্যে হতে পারে, যা এলএইচএস (বাম-পাশের দিকের) রেফারেন্স, বা এটির মান পুনরুদ্ধারের উদ্দেশ্যে হতে পারে, যা একটি আরএইচএস (ডান দিকের দিকের) রেফারেন্স ।
  • এলএইচএস রেফারেন্স অ্যাসাইনমেন্ট অপারেশন থেকে ফলাফল। স্কোপ-সম্পর্কিত অ্যাসাইনমেন্টগুলি = অপারেটরের সাথে বা ফাংশন প্যারামিটারগুলিতে আর্গুমেন্ট পাস করার মাধ্যমে ঘটতে পারে।
  • জাভাস্ক্রিপ্ট ইঞ্জিনটি কার্যকর করার আগে প্রথমে কোডটি সংকলন করে এবং এর ফলে এটি var a = 2 এর মতো বিবৃতিগুলিকে আলাদা করে দেয়; দুটি পৃথক ধাপে: 1 ম। প্রথমে var a এটিকে সেই সুযোগে ঘোষণা করুন। কোড সম্পাদনের আগে এটি শুরুতে সঞ্চালিত হয়। 2nd। পরে, ভেরিয়েবল (এলএইচএস রেফারেন্স) সন্ধান করার জন্য একটি = 2 এবং যদি খুঁজে পাওয়া যায় তবে তা নির্ধারণ করুন।
  • এলএইচএস এবং আরএইচএস উভয়ই রেফারেন্স চেহারা আপগুলি বর্তমানে সম্পাদনকারী স্কোপ থেকে শুরু হয় এবং যদি প্রয়োজন হয় (তবে তারা সেখানে যা খুঁজছেন তা তারা খুঁজে পান না), তারা নেস্টেড স্কোপ, একটি স্কোপ (তল) পর্যন্ত তাদের পথে কাজ করে ) একটি সময়ে, সনাক্তকারীকে সন্ধান করা, যতক্ষণ না তারা গ্লোবাল (শীর্ষ তল) এ পৌঁছায় এবং থামবে না, এবং হয় এটি সন্ধান করবে বা না পাবে। অসম্পূর্ণ আরএইচএস রেফারেন্সগুলির ফলাফলের ফলে রেফারেন্স এরির ফেলে দেওয়া হচ্ছে। অসম্পূর্ণ এলএইচএস রেফারেন্সগুলির ফলে এই নামের একটি স্বয়ংক্রিয়, অন্তর্নিহিতভাবে তৈরি বিশ্বব্যাপী (যদি স্ট্রাইক মোডে না থাকে) বা একটি রেফারেন্সেরর (যদি স্ট্রাইক মোডে থাকে) ফলাফল হয়।
  • স্কোপটি "বুদবুদ" এর একটি সিরিজ নিয়ে গঠিত যা প্রতিটি পাত্রে বা বালতি হিসাবে কাজ করে, যাতে সনাক্তকারী (পরিবর্তনশীল, ফাংশন) ঘোষিত হয় declared এই বুদবুদগুলি একে অপরের ভিতরে খুব সুন্দরভাবে বাসা বাঁধে এবং লেখক সময় এই বাসা বাঁধার সংজ্ঞা দেওয়া হয়।

-3

জাভাস্ক্রিপ্টে দুটি ধরণের স্কোপ রয়েছে।

  1. গ্লোবাল স্কোপ : ভেরিয়েবল যা বৈশ্বিক স্কোপে ঘোষণা করা হয় প্রোগ্রামের যে কোনও জায়গায় খুব সহজেই ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ:

    var carName = " BMW";
    
    // code here can use carName
    
    function myFunction() {
         // code here can use carName 
    }
  2. কার্যকরী সুযোগ বা স্থানীয় সুযোগ : এই সুযোগে ঘোষিত ভেরিয়েবল কেবল নিজস্ব ফাংশনে ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ:

    // code here can not use carName
    function myFunction() {
       var carName = "BMW";
       // code here can use carName
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.