জাভাস্ক্রিপ্টে ভেরিয়েবল ডিক্লেয়ারেশন সিনট্যাক্সের মধ্যে পার্থক্য (বৈশ্বিক ভেরিয়েবল সহ)?


292

ভেরিয়েবল ঘোষণার মধ্যে কি কোনও পার্থক্য রয়েছে:

var a=0; //1

...এই পথে:

a=0; //2

... অথবা:

window.a=0; //3

বিশ্বজুড়ে?


2
এএফআইকে ভার a = 0; অন্য
জেএস

আমি উইন্ডো.এ সম্পর্কে জানি না তবে অন্যান্য 2 টি উপায় বৈশ্বিক সুযোগে একই।
প্রোগ্রামার

1
@ আইভানমোনসেলার সত্যিই? লিঙ্ক করুন
রায়নোস

@ রায়নস, আমি এটি আমার নিজের ওয়েবসাইটে অভিজ্ঞতা করি। আই 6 নির্দিষ্ট হতে হবে। আমি আমার
ভের এনামটি

@ অশ্বিনী বিশ্বব্যাপী সুযোগে উইন্ডো হ'ল বিশ্বব্যাপী বস্তু (ব্রাউজারগুলিতে)। var a = 1; console.log (ক);
কনসোল.লগ

উত্তর:


557

হ্যাঁ, বেশ কয়েকটি পার্থক্য রয়েছে, যদিও ব্যবহারিক দিক থেকে তারা সাধারণত বড় হয় না।

চতুর্থ উপায় আছে, এবং ES2015 (ES6) হিসাবে আরও দুটি আছে। আমি শেষে চতুর্থটি যুক্ত করেছি, তবে # 1 এর পরে E2015 টি উপায় সন্নিবেশ করিয়েছি (কেন আপনি তা দেখতে পাবেন), তাই আমাদের রয়েছে:

var a = 0;     // 1
let a = 0;     // 1.1 (new with ES2015)
const a = 0;   // 1.2 (new with ES2015)
a = 0;         // 2
window.a = 0;  // 3
this.a = 0;    // 4

এই বিবৃতি ব্যাখ্যা

# 1 var a = 0;

এটি একটি বৈশ্বিক পরিবর্তনশীল তৈরি করে যা বৈশ্বিক অবজেক্টেরও একটি সম্পত্তি , যা আমরা windowব্রাউজারগুলিতে (বা thisকোনও বিশ্বব্যাপী স্কোপের মাধ্যমে , অ-কঠোর কোডে) অ্যাক্সেস করি । কিছু অন্যান্য বৈশিষ্ট্যের বিপরীতে সম্পত্তিটি সরানো যাবে না delete

স্পেসিফিকেশন পদগুলিতে, এটি বৈশ্বিক পরিবেশের জন্য পরিবেশ রেকর্ড অবজেক্টটিতে একটি শনাক্তকারীকে বাঁধাই করে । এটি এটিকে বৈশ্বিক বস্তুর সম্পত্তি হিসাবে পরিণত করে কারণ বিশ্বব্যাপী অবজেক্টটি যেখানে বিশ্বব্যাপী পরিবেশের অবজেক্টের পরিবেশগত রেকর্ডের জন্য শনাক্তকরণের সাথে সম্পর্কিত হয়। এই কারণেই সম্পত্তিটি অ-বিলোপযোগ্য: এটি কেবল একটি সাধারণ সম্পত্তি নয়, এটি শনাক্তকারীকে বাধ্যতামূলক।

বাইন্ডিং (পরিবর্তনশীল) কোডের প্রথম লাইনের রান হওয়ার আগে সংজ্ঞায়িত হয় ( varনীচে "কখন ঘটে" দেখুন)।

মনে রাখবেন যে আইই 8 এবং এর আগে, এর উপর নির্মিত সম্পত্তিটি গণ্যযোগ্যwindow নয় ( বিবৃতিতে প্রদর্শিত হবে না )। আইই 9, ক্রোম, ফায়ারফক্স এবং অপেরা-তে এটি গণনাযোগ্য।for..in


# 1.1 let a = 0;

এটি একটি বিশ্বব্যাপী পরিবর্তনশীল তৈরি করে যা বিশ্বব্যাপী বস্তুর সম্পত্তি নয় । ES2015 হিসাবে এটি একটি নতুন জিনিস।

স্পেসিফিকেশন শর্তাবলী, এটি বিশ্বব্যাপী পরিবেশের জন্য পরিবেশগত রেকর্ড বস্তুর পরিবর্তে ঘোষিত পরিবেশ রেকর্ডে একটি শনাক্তকারীকে বাধ্যতামূলক তৈরি করে । বিশ্বব্যাপী পরিবেশ একটি বিভক্ত পরিবেশ রেকর্ড, সব পুরোনো কাপড় বিশ্বব্যাপী বস্তু (যায় এক তার মধ্যে অদ্বিতীয় বস্তুর সব নতুন উপাদানের জন্য পরিবেশ রেকর্ড) এবং অন্য ( , , এবং দ্বারা নির্মিত ফাংশন ) যে না গ্লোবাল অবজেক্টে যানletconstclass

অবিচল নির্মিত আগে তার পরিক্ষেপ ব্লক যে কোন কোড ধাপে ধাপে মৃত্যুদন্ড কার্যকর করা হয় (এই ক্ষেত্রে, কোন বিশ্বব্যাপী কোড রান সামনে), কিন্তু এটা না প্রবেশযোগ্য কোন ভাবেই পর্যন্ত ধাপে ধাপে সঞ্চালনের ছুঁয়েছে letবিবৃতি। এক্সিকিউশন একবার letবিবৃতিতে পৌঁছে গেলে পরিবর্তনশীল অ্যাক্সেসযোগ্য হয়। ( নীচে "কখন letএবং constকখন হবে" দেখুন))


# 1.2 const a = 0;

একটি বিশ্বব্যাপী ধ্রুবক তৈরি করে, যা বৈশ্বিক বস্তুর সম্পত্তি নয়।

constহ'ল এটির মতো letযা আপনাকে অবশ্যই একটি আরম্ভকারী ( = valueঅংশ) সরবরাহ করতে হবে এবং ধ্রুবকের মান একবার তৈরি হয়ে গেলে আপনি এটি পরিবর্তন করতে পারবেন না। প্রচ্ছদের অধীনে, এটি ঠিক ঠিক এর মতো letতবে শনাক্তকারীকে একটি পতাকা দিয়ে বলছে যে এর মান পরিবর্তন করা যায় না। ব্যবহার constআপনার জন্য তিনটি জিনিস করে:

  1. যদি আপনি ধ্রুবককে অর্পণ করার চেষ্টা করেন তবে এটি একটি পার্স-টাইম ত্রুটি করে।
  2. অন্যান্য প্রোগ্রামারদের জন্য তার অপরিবর্তনীয় প্রকৃতির দলিলগুলি।
  3. জাভাস্ক্রিপ্ট ইঞ্জিনটিকে পরিবর্তিত হবে না এমন ভিত্তিতে অনুকূলিত করতে দেয়।

# 2 a = 0;

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

এবং মজার বিষয় হল, আবার আইই 8 এবং তার আগে, সম্পত্তিটি হিসাবযোগ্য নয় ( for..inবিবৃতিতে দেখায় না ) তৈরি করে। এটি অদ্ভুত, বিশেষত নীচে # 3 দেওয়া আছে।


# 3 window.a = 0;

এটি গ্লোবাল অবজেক্টে স্পষ্টভাবে একটি সম্পত্তি তৈরি করে যা গ্লোবাল অবজেক্টকে windowবোঝায় গ্লোবাল ব্যবহার করে (ব্রাউজারগুলিতে; কিছু ব্রাউজারে নয় এমন পরিবেশে একটি সমমানের বৈশ্বিক পরিবর্তনশীল থাকে, যেমন globalনোডজেএস-তে)। এটি একটি সাধারণ সম্পত্তি হওয়ায় আপনি এটি মুছতে পারেন।

এই সম্পত্তি হয় , গণনীয় IE8 উপর এবং তার আগে, এবং প্রত্যেক অন্যান্য ব্রাউজারে আমি চেষ্টা করেছি।


# 4 this.a = 0;

ঠিক # 3 ভালো লেগেছে, আমরা মাধ্যমে বিশ্বব্যাপী বস্তুর উল্লেখ করেছেন সেগুলি ছাড়া thisবিশ্বব্যাপী পরিবর্তে window। এটি কঠোর মোডে কাজ করবে না, যদিও, কঠোর মোডে গ্লোবাল কোডে, thisবৈশ্বিক অবজেক্টের কোনও রেফারেন্স নেই ( undefinedপরিবর্তে এর মান রয়েছে )।


বৈশিষ্ট্য মোছা হচ্ছে

"মুছে ফেলা" বা "অপসারণ" বলতে আমি কী বুঝি a? ঠিক তেমন: deleteকীওয়ার্ডের মাধ্যমে সম্পত্তি (পুরোপুরি) সরানো হচ্ছে :

window.a = 0;
display("'a' in window? " + ('a' in window)); // displays "true"
delete window.a;
display("'a' in window? " + ('a' in window)); // displays "false"

deleteকোনও বস্তু থেকে সম্পত্তিকে সম্পূর্ণ সরিয়ে দেয়। windowঅপ্রত্যক্ষভাবে মাধ্যমে সংযুক্ত বৈশিষ্ট্যগুলি সহ আপনি এটি করতে পারবেন না var, deleteহয় নীরবে উপেক্ষা করা হবে বা একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে (জাভাস্ক্রিপ্ট প্রয়োগের উপর নির্ভর করে এবং আপনি কঠোর মোডে রয়েছেন কিনা)।

সতর্কতা : আইই 8 আবার (এবং সম্ভবত পূর্ববর্তী, এবং আই 9 9-আই 1111 "ভাঙ্গা" সামঞ্জস্যতা "মোডে): এটি আপনাকে windowঅনুমতি দেওয়া সত্ত্বেও আপনাকে অবজেক্টের বৈশিষ্ট্যগুলি মুছতে দেয় না। সবচেয়ে খারাপ, আপনি চেষ্টা করার সময় এটি একটি ব্যতিক্রম ছোঁড়ে ( আইই 8 এবং অন্যান্য ব্রাউজারগুলিতে এই পরীক্ষাটি ব্যবহার করে দেখুন)। সুতরাং windowঅবজেক্ট থেকে মোছার সময় , আপনি প্রতিরক্ষামূলক হতে হবে:

try {
    delete window.prop;
}
catch (e) {
    window.prop = undefined;
}

এটি সম্পত্তি মুছতে চেষ্টা করে এবং যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে এটি পরবর্তী সেরা কাজটি করে এবং সম্পত্তিটিকে সেট করে undefined

এটি কেবলমাত্র আইটেমের ক্ষেত্রে windowএবং কেবল88 এবং তার আগে (বা আই 9 9-আই 1111 "ভাঙ্গা" সামঞ্জস্যতা "মোডে) প্রয়োগ করা হয় । অন্যান্য ব্রাউজারগুলি windowউপরের নিয়মের সাপেক্ষে সম্পত্তি মুছে ফেলার ক্ষেত্রে ঠিক আছে ।


যখন varহয়

varস্টেটমেন্টের মাধ্যমে সংজ্ঞায়িত ভেরিয়েবলগুলি এক্সিকিউশন প্রসঙ্গে কোনও ধাপে ধাপে কোড চালনার আগে তৈরি করা হয় এবং সুতরাং সম্পত্তিটি varবিবৃতি দেওয়ার আগেই ভালভাবে উপস্থিত থাকে ।

এটি বিভ্রান্তিকর হতে পারে, তাই আসুন একবার দেখুন:

display("foo in window? " + ('foo' in window)); // displays "true"
display("window.foo = " + window.foo);          // displays "undefined"
display("bar in window? " + ('bar' in window)); // displays "false"
display("window.bar = " + window.bar);          // displays "undefined"
var foo = "f";
bar = "b";
display("foo in window? " + ('foo' in window)); // displays "true"
display("window.foo = " + window.foo);          // displays "f"
display("bar in window? " + ('bar' in window)); // displays "true"
display("window.bar = " + window.bar);          // displays "b"

সরাসরি উদাহরণ:

আপনি দেখতে পাচ্ছেন, চিহ্নটি fooপ্রথম লাইনের আগে সংজ্ঞায়িত করা হয়েছে, তবে প্রতীকটি barএটি নয়। var foo = "f";বিবৃতিটি যেখানে রয়েছে, সেখানে দুটি জিনিস রয়েছে: চিহ্নের সংজ্ঞা দেওয়া, কোডের প্রথম লাইনটি চালানোর আগে ঘটে; এবং সেই প্রতীকটিতে একটি অ্যাসাইনমেন্ট করা হচ্ছে, যেখানে লাইনটি ধাপে ধাপে প্রবাহে থাকবে happens এটি " varউত্তোলন" হিসাবে পরিচিত কারণ var fooঅংশটি শীর্ষস্থানীয় ("উত্তোলিত") সরানো হয়েছে, তবে foo = "f"অংশটি তার মূল অবস্থানে রেখে গেছে। ( আমার রক্তাল্পতা সম্পর্কিত ছোট্ট ব্লগে দরিদ্র ভুল বোঝাবুঝিvar দেখুন ))


কখন letএবং constঘটবে

letএবং কয়েক উপায় constথেকে পৃথক var। যেভাবে প্রশ্নের সাথে প্রাসঙ্গিক তা হ'ল যে কোনও ধাপে ধাপে কোড চালানোর আগে তাদের সংজ্ঞায়িত বাঁধাই তৈরি করা হয়েছে, বা বিবৃতি না পৌঁছানো পর্যন্ত এটি অ্যাক্সেসযোগ্য নয় ।letconst

সুতরাং এটি চালানোর সময়:

display(a);    // undefined
var a = 0;
display(a);    // 0

এটি একটি ত্রুটি নিক্ষেপ করে:

display(a);    // ReferenceError: a is not defined
let a = 0;
display(a);

অন্য দুটি উপায় যা letও এর constথেকে পৃথক var, যা সত্যই প্রশ্নের সাথে প্রাসঙ্গিক নয়, সেগুলি হল:

  1. varসর্বদা সম্পূর্ণ কার্যকরকরণ প্রসঙ্গে (সমস্ত গ্লোবাল কোড জুড়ে, বা যেখানে উপস্থিত হয় সেখানে ফাংশন কোড জুড়ে) প্রয়োগ হয় , letএবং constকেবল যেখানে প্রদর্শিত হবে সেই ব্লকের মধ্যেই প্রয়োগ করে । অর্থাৎ varফাংশনটি (বা গ্লোবাল) সুযোগ আছে, কিন্তু letএবং constব্লক সুযোগ আছে।

  2. var aএকই প্রসঙ্গে পুনরাবৃত্তি নিরীহ, তবে আপনার যদি let a(বা const a) থাকে তবে অন্য let aবা একটি const aবা একটি var aথাকা একটি বাক্য গঠন ত্রুটি।

এখানে একটি উদাহরণ প্রদর্শক যে letএবং constঅবিলম্বে কার্যকর তাদের ব্লক যে ব্লক রান মধ্যে যে কোনো কোড সামনে, কিন্তু এই সময়ের প্রবেশযোগ্য নয় letবা constবিবৃতি:

var a = 0;
console.log(a);
if (true)
{
  console.log(a); // ReferenceError: a is not defined
  let a = 1;
  console.log(a);
}

নোট করুন যে দ্বিতীয়টি ব্লকের বাইরে থেকে console.logঅ্যাক্সেস না করে ব্যর্থ হয় a


অফ-টপিক: গ্লোবাল অবজেক্টকে বিশৃঙ্খলা এড়িয়ে চলুন ( window)

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

(function() {
    var a = 0; // `a` is NOT a property of `window` now

    function foo() {
        alert(a);   // Alerts "0", because `foo` can access `a`
    }
})();

এই উদাহরণে, আমরা একটি ফাংশন সংজ্ঞায়িত করি এবং এটি অবিলম্বে কার্যকর করা হবে ( ()শেষে)।

এইভাবে ব্যবহৃত একটি ফাংশন ঘন ঘন একটি স্কোপিং ফাংশন বলা হয় । স্কোপিং ফাংশনটির মধ্যে সংজ্ঞায়িত ফাংশনগুলি স্কোপিং ফাংশনে সংজ্ঞায়িত ভেরিয়েবলগুলিতে অ্যাক্সেস করতে পারে কারণ তারা সেই ডেটা ধরে ক্লোজার হয়ে আছে (দেখুন: বন্ধকগুলি আমার রক্তাল্পের ছোট্ট ব্লগে জটিল নয় )।


আমি কী window['a']=0এটি পরিষ্কার করতে পারি যে আমি উইন্ডোটিকে মানচিত্র হিসাবে ব্যবহার করছি? এমন কি windowবিশেষ যে কোনও ব্রাউজারগুলি এটি ব্যবহার করতে দেয় না এবং আমাকে ব্যবহার করতে বাধ্য করে window.a?
জেইন

# 3 এর একটি নোট যা সম্ভবত স্পষ্ট করার মতো: window.a = 0;কেবলমাত্র ব্রাউজার পরিবেশে এবং কেবল কনভেনশন দ্বারা কাজ করে। নামে একটি পরিবর্তনশীল বিশ্বব্যাপী বস্তু বাঁধাই windowইএস ফটকা খেলা নয় এবং তাই কাজ করবে না, উদাহরণস্বরূপ, V8 বা Node.js জন্য, যখন this.a = 0;(যখন বিশ্বব্যাপী মৃত্যুদন্ড প্রেক্ষাপটে প্রার্থনা) কোন পরিবেশে কাজ করবে যেহেতু বৈশিষ্ট নেই উল্লেখ যে একটি গ্লোবাল অবজেক্ট থাকতে হবে । যদি আপনার কোডটি আইআইএফই -তে অফ-টপিক বিভাগ হিসাবে মোড়ানো থাকে তবে আপনি thisনামের পরামিতি হিসাবে পাস করতে পারেন windowবা globalবিশ্বব্যাপী অবজেক্টের প্রত্যক্ষ রেফারেন্স পেতে পারেন।
Sherlock_HJ

@ শার্লক_জেজে: আমি "ব্রাউজারগুলিতে" যুক্ত করেছি; এটি উত্তরের আগেও ছিল, তবে লোকেরা যদি এড়িয়ে যায় তবে আমি এটিকে যুক্ত করেছি। এটা এখন চশমা হয় ; এটি কেবল পাস করার সময়, আপনি এমন কোনও ব্রাউজার পাবেন না যা এটি করে না। আমি খানিকটা অবাক হয়েছি এটি আনেক্সেক্স বি তে নেই
টিজে ক্রাউডার

@ টিজে ক্রাউডার, সুতরাং, একটি গ্লোবাল ভেরিয়েবল var a = 0;স্বয়ংক্রিয়ভাবে ঘোষিত বিশ্বব্যাপী বস্তুর সম্পত্তি হয়ে যায়। যদি আমি var b = 0;কোনও ফাংশন ঘোষণার মধ্যে ঘোষণা করি তবে এটি কি কোনও অন্তর্নিহিত বস্তুর সম্পত্তি হবে?
ইজপ্রেসো

@ এপ্রেসো: না এবং হ্যাঁ তারা একটি বস্তুর বৈশিষ্ট্যাবলী হতে পারি ( EnvironmentRecord এর VariableEnvironment এর ExecutionContext যেখানে তারা প্রদর্শিত বিশদের এখানে এবং এখানে ), কিন্তু সেখানে সরাসরি অ্যাক্সেস করতে কোন উপায় যে প্রোগ্রাম কোড থেকে অবজেক্ট।
টিজে ক্রাউডার

40

এটি সহজ রাখা:

a = 0

উপরের কোডটি বিশ্বব্যাপী স্কোপ ভেরিয়েবল দেয়

var a = 0;

এই কোডটি বর্তমান স্কোপ এবং এর অধীনে ব্যবহার করার জন্য একটি পরিবর্তনশীল দেবে

window.a = 0;

এটি সাধারণত গ্লোবাল ভেরিয়েবলের সমান।


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

গ্লোবাল নিজেই এর অর্থ হ'ল আপনি যে জায়গাতে আমি বর্তমান স্কোপটি উল্লেখ করেছেন সেগুলি সহ আপনি যে কোনও জায়গায় ভেরিয়েবলটি অ্যাক্সেস / পড়তে / লিখতে পারবেন, এটি এতটাই স্পষ্ট। এবং যদি আপনি সেই উইন্ডোটি.এ এবং 'এ' স্ক্রিপ্টে গ্লোবাল হতে না চান তবে আপনি 100% ভুল।
উমাইর জব্বার

3
@ উমাইর: "গ্লোবাল নিজেই এর অর্থ হ'ল আপনি যে কোনও জায়গায় ভেরিয়েবলটি অ্যাক্সেস / পড়তে / লিখতে পারবেন" রাইট। আবার, আপনি মনে করছেন প্রথমটি এবং শেষটিকে মাঝের চেয়ে "গ্লোবাল" হিসাবে ডাকাবেন, তারা অবশ্যই তা নয়।
টিজে ক্রাউডার

4
মাঝেরটি একটি ফাংশনের অভ্যন্তরে ব্যবহৃত বলে মনে করা হয়, মূল ক্ষেত্রের অধীনে ব্যবহার করা থাকলে সেগুলি সব একই হবে। কোনও ফাংশনের ভিতরে ভের ব্যবহার করা আমার ধারণা ছিল
উমাইর জব্বার

4
@ উমাইর: "একটি ফাংশনের ভিতরে ভের ব্যবহার করা আমার অনুমান" আহা, ঠিক আছে। তবে এটাই প্রশ্ন নয়। প্রশ্নটি খুব স্পষ্ট করে বলেছে "বৈশ্বিক পরিধি" । আপনি যদি ধারণাটি পরিবর্তন করতে চলেছেন (যা যথেষ্ট ন্যায্য, আরও সাধারণ বিষয়টিকে প্রসারিত ও ব্যাখ্যা করার জন্য), আপনি নিজের জবাব দিয়ে যা করছেন তা পরিষ্কার হওয়া দরকার।
টিজে ক্রাউডার

10
<title>Index.html</title>
<script>
    var varDeclaration = true;
    noVarDeclaration = true;
    window.hungOnWindow = true;
    document.hungOnDocument = true;
</script>
<script src="external.js"></script>

/* external.js */

console.info(varDeclaration == true); // could be .log, alert etc
// returns false in IE8

console.info(noVarDeclaration == true); // could be .log, alert etc
// returns false in IE8

console.info(window.hungOnWindow == true); // could be .log, alert etc
// returns true in IE8

console.info(document.hungOnDocument == true); // could be .log, alert etc
// returns ??? in IE8 (untested!)  *I personally find this more clugy than hanging off window obj

কোনও বিশ্বব্যাপী অবজেক্ট কি সমস্ত ভার্স ডিফল্টভাবে বন্ধ হয়ে যায়? উদাহরণস্বরূপ: 'গ্লোবালস.নোবার ঘোষণা'


খুব সুন্দর এক্সপ্লোরেশন। window.*ঘোষণা ব্যবহারের সুনির্দিষ্ট গাইড । এই ঘোষণাটি আপনার কোডটি অনুলিপি করার পক্ষে সবচেয়ে নিরাপদ দেখায় এবং এটি পরিষ্কারও হয়।
ড্যান

7

টিজে ক্রাউডারের দুর্দান্ত উত্তরের ভিত্তিতে : ( অফ-বিষয়: বিশৃঙ্খলা এড়ানwindow )

এটি তাঁর ধারণার উদাহরণ:

এইচটিএমএল

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js ( এই উত্তরের ভিত্তিতে )

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

এখানে plnkr । আশা করি এটি সাহায্য করবে!


5

বৈশ্বিক স্কোপগুলিতে কোনও অর্থগত পার্থক্য নেই।

a=0আপনার অঘোষিত ভেরিয়েবলের মান নির্ধারণের পরে আপনার সত্যিই এড়ানো উচিত ।

এছাড়াও বিশ্বব্যাপী সুযোগ সম্পাদনা এড়াতে ক্লোজারগুলি ব্যবহার করুন

(function() {
   // do stuff locally

   // Hoist something to global scope
   window.someGlobal = someLocal
}());

সর্বদা ক্লোজারগুলি ব্যবহার করুন এবং সর্বদা গ্লোবাল স্কোপে উত্তোলন করুন যখন এটি একেবারে প্রয়োজনীয় ec যাইহোক আপনার বেশিরভাগ যোগাযোগের জন্য আপনার অ্যাসিক্রোনাস ইভেন্ট হ্যান্ডলিংটি ব্যবহার করা উচিত।

@ অবিয়ানমোনসেলর যেমন উল্লেখ করেছেন যে এখানে একটি var a = fooফাইল রয়েছে যা কেবলমাত্র ফাইল স্কোপের জন্য একটি বিশ্বব্যাপী ঘোষণা করে। এটি আইই এর কুখ্যাত ভাঙ্গা দোভাষীর একটি সমস্যা। এই বাগটি পরিচিত শোনায় তাই সম্ভবত এটি সত্য।

তাই লেগে থাকো window.globalName = someLocalpointer


2
"বৈশ্বিক সুযোগে কোনও অর্থগত পার্থক্য নেই।" আসলে, ছিলো বিশাল শব্দার্থিক পার্থক্য, পদ্ধতি যার দ্বারা সম্পত্তি সংজ্ঞায়িত পরার সম্পূর্ণরূপে ভিন্ন - কিন্তু বাস্তব পদ এটি শুধুমাত্র একটি ছোট নিচে boils প্রকৃত পার্থক্য (যে তুমি পারবে না deleteএকটি var)।
টিজে ক্রাউডার

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

হা. তারা এর আগে যদি আপনি ব্যবহার সংজ্ঞায়িত করছি var। এগুলি কেবল সম্পূর্ণ ভিন্ন প্রক্রিয়া যার অনেকগুলি ব্যবহারিক ফলাফল রয়েছে। :-)
টিজে ক্রাউডার

@ টিজে ক্রাউডার আমি উল্লেখ করতে ভুলে গেছি যে varস্কোপ বন্ধের দিকে যায়।
রায়নোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.