ভেরিয়েবল ঘোষণার মধ্যে কি কোনও পার্থক্য রয়েছে:
var a=0; //1
...এই পথে:
a=0; //2
... অথবা:
window.a=0; //3
বিশ্বজুড়ে?
ভেরিয়েবল ঘোষণার মধ্যে কি কোনও পার্থক্য রয়েছে:
var a=0; //1
...এই পথে:
a=0; //2
... অথবা:
window.a=0; //3
বিশ্বজুড়ে?
উত্তর:
হ্যাঁ, বেশ কয়েকটি পার্থক্য রয়েছে, যদিও ব্যবহারিক দিক থেকে তারা সাধারণত বড় হয় না।
চতুর্থ উপায় আছে, এবং 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আপনার জন্য তিনটি জিনিস করে:
# 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, যা সত্যই প্রশ্নের সাথে প্রাসঙ্গিক নয়, সেগুলি হল:
varসর্বদা সম্পূর্ণ কার্যকরকরণ প্রসঙ্গে (সমস্ত গ্লোবাল কোড জুড়ে, বা যেখানে উপস্থিত হয় সেখানে ফাংশন কোড জুড়ে) প্রয়োগ হয় , letএবং constকেবল যেখানে প্রদর্শিত হবে সেই ব্লকের মধ্যেই প্রয়োগ করে । অর্থাৎ varফাংশনটি (বা গ্লোবাল) সুযোগ আছে, কিন্তু letএবং constব্লক সুযোগ আছে।
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?
window.a = 0;কেবলমাত্র ব্রাউজার পরিবেশে এবং কেবল কনভেনশন দ্বারা কাজ করে। নামে একটি পরিবর্তনশীল বিশ্বব্যাপী বস্তু বাঁধাই windowইএস ফটকা খেলা নয় এবং তাই কাজ করবে না, উদাহরণস্বরূপ, V8 বা Node.js জন্য, যখন this.a = 0;(যখন বিশ্বব্যাপী মৃত্যুদন্ড প্রেক্ষাপটে প্রার্থনা) কোন পরিবেশে কাজ করবে যেহেতু বৈশিষ্ট নেই উল্লেখ যে একটি গ্লোবাল অবজেক্ট থাকতে হবে । যদি আপনার কোডটি আইআইএফই -তে অফ-টপিক বিভাগ হিসাবে মোড়ানো থাকে তবে আপনি thisনামের পরামিতি হিসাবে পাস করতে পারেন windowবা globalবিশ্বব্যাপী অবজেক্টের প্রত্যক্ষ রেফারেন্স পেতে পারেন।
var a = 0;স্বয়ংক্রিয়ভাবে ঘোষিত বিশ্বব্যাপী বস্তুর সম্পত্তি হয়ে যায়। যদি আমি var b = 0;কোনও ফাংশন ঘোষণার মধ্যে ঘোষণা করি তবে এটি কি কোনও অন্তর্নিহিত বস্তুর সম্পত্তি হবে?
এটি সহজ রাখা:
a = 0
উপরের কোডটি বিশ্বব্যাপী স্কোপ ভেরিয়েবল দেয়
var a = 0;
এই কোডটি বর্তমান স্কোপ এবং এর অধীনে ব্যবহার করার জন্য একটি পরিবর্তনশীল দেবে
window.a = 0;
এটি সাধারণত গ্লোবাল ভেরিয়েবলের সমান।
a অধীনে বর্তমান সুযোগ আপনি পারেন। এছাড়াও, আপনার "গ্লোবাল ভেরিয়েবল" এর ব্যবহার কিছুটা বন্ধ - আপনি যে দুটি জায়গাকে "গ্লোবাল ভেরিয়েবল" বলছেন সে স্থানটি আপনি বলছেন না তার চেয়ে বেশি বিশ্বব্যাপী নয়।
<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.*ঘোষণা ব্যবহারের সুনির্দিষ্ট গাইড । এই ঘোষণাটি আপনার কোডটি অনুলিপি করার পক্ষে সবচেয়ে নিরাপদ দেখায় এবং এটি পরিষ্কারও হয়।
টিজে ক্রাউডারের দুর্দান্ত উত্তরের ভিত্তিতে : ( অফ-বিষয়: বিশৃঙ্খলা এড়ান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 । আশা করি এটি সাহায্য করবে!
বৈশ্বিক স্কোপগুলিতে কোনও অর্থগত পার্থক্য নেই।
a=0আপনার অঘোষিত ভেরিয়েবলের মান নির্ধারণের পরে আপনার সত্যিই এড়ানো উচিত ।
এছাড়াও বিশ্বব্যাপী সুযোগ সম্পাদনা এড়াতে ক্লোজারগুলি ব্যবহার করুন
(function() {
// do stuff locally
// Hoist something to global scope
window.someGlobal = someLocal
}());
সর্বদা ক্লোজারগুলি ব্যবহার করুন এবং সর্বদা গ্লোবাল স্কোপে উত্তোলন করুন যখন এটি একেবারে প্রয়োজনীয় ec যাইহোক আপনার বেশিরভাগ যোগাযোগের জন্য আপনার অ্যাসিক্রোনাস ইভেন্ট হ্যান্ডলিংটি ব্যবহার করা উচিত।
@ অবিয়ানমোনসেলর যেমন উল্লেখ করেছেন যে এখানে একটি var a = fooফাইল রয়েছে যা কেবলমাত্র ফাইল স্কোপের জন্য একটি বিশ্বব্যাপী ঘোষণা করে। এটি আইই এর কুখ্যাত ভাঙ্গা দোভাষীর একটি সমস্যা। এই বাগটি পরিচিত শোনায় তাই সম্ভবত এটি সত্য।
তাই লেগে থাকো window.globalName = someLocalpointer
deleteএকটি var)।
var। এগুলি কেবল সম্পূর্ণ ভিন্ন প্রক্রিয়া যার অনেকগুলি ব্যবহারিক ফলাফল রয়েছে। :-)
varস্কোপ বন্ধের দিকে যায়।