क्या चर घोषित करने में कोई अंतर है:
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 के बाद ES2015 तरीके डाले हैं (आप देखेंगे क्यों), इसलिए हमारे पास है:
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होता है" देखें)।
ध्यान दें कि IE8 और इससे पहले, बनाई गई संपत्ति गणना योग्यwindow नहीं है ( बयानों में नहीं दिखाई देती है )। IE9 में, क्रोम, फ़ायरफ़ॉक्स और ओपेरा, यह बहुत ही शानदार है।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;
यह स्पष्ट रूप से वैश्विक वस्तु पर एक संपत्ति बनाता है । जैसा कि यह एक सामान्य संपत्ति है, आप इसे हटा सकते हैं। मैं यह नहीं करने की सलाह दूंगा, यह बाद में आपके कोड को पढ़ने वाले किसी को भी अस्पष्ट हो सकता है। यदि आप ईएस 5 के सख्त मोड का उपयोग करते हैं, तो ऐसा करना (गैर-मौजूद चर पर असाइन करना) एक त्रुटि है। यह सख्त मोड का उपयोग करने के कई कारणों में से एक है।
और दिलचस्प बात यह है IE8 और पहले पर फिर से, संपत्ति नहीं बनाया गणनीय (में दिखाई नहीं देता for..inबयान)। यह अजीब है, विशेष रूप से नीचे # 3 दिया गया है।
# 3 window.a = 0;
यह स्पष्ट रूप से वैश्विक ऑब्जेक्ट पर एक संपत्ति बनाता है, वैश्विक का उपयोग windowकरता है जो वैश्विक ऑब्जेक्ट को संदर्भित करता है (ब्राउज़रों पर; कुछ गैर-ब्राउज़र वातावरण में एक समान वैश्विक चर होता है, जैसे कि globalNodeJS)। जैसा कि यह एक सामान्य संपत्ति है, आप इसे हटा सकते हैं।
यह गुण है , गणनीय 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या तो चुपचाप अनदेखा किया जाता है या एक अपवाद को फेंकता है (जावास्क्रिप्ट कार्यान्वयन के आधार पर और क्या आप सख्त मोड में हैं)।
चेतावनी : IE8 फिर (और शायद पहले, और IE9-IE11 टूटी हुई "संगतता" मोड में): यह आपको windowऑब्जेक्ट के गुणों को हटाने नहीं देगा , तब भी जब आपको अनुमति दी जानी चाहिए। इससे भी बदतर, यह एक अपवाद फेंकता है जब आप कोशिश करते हैं ( IE8 और अन्य ब्राउज़रों में इस प्रयोग को आज़माएं )। इसलिए जब windowऑब्जेक्ट से हटाते हैं , तो आपको रक्षात्मक होना होगा:
try {
delete window.prop;
}
catch (e) {
window.prop = undefined;
}
यह संपत्ति को हटाने की कोशिश करता है, और अगर एक अपवाद को फेंक दिया जाता है तो यह अगली सबसे अच्छी बात करता है और संपत्ति को सेट करता है undefined।
यह केवलwindow ऑब्जेक्ट पर लागू होता है , और केवल (जहां तक मुझे पता है) IE8 और इससे पहले (या टूटी हुई "संगतता" मोड में IE9-IE11)। अन्य ब्राउजर 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";कथन है, वास्तव में दो चीजें हैं: प्रतीक को परिभाषित करना, जो कोड की पहली पंक्ति चलने से पहले होता है; और उस प्रतीक के लिए एक कार्य कर रहा है, जो कि चरण-दर-चरण प्रवाह में होता है। इसे " varउत्थापन" के रूप में जाना जाता है क्योंकि var fooभाग को ("लहराया") दायरे के शीर्ष पर ले जाया जाता है, लेकिन foo = "f"भाग को उसके मूल स्थान पर छोड़ दिया जाता है। ( मेरे छोटे से ब्लॉग पर गरीब गलतvar समझें।)
letऔर constक्या हुआletऔर कुछ तरीकों constसे अलग varहैं। यह सवाल जिस तरह से प्रासंगिक है, वह यह है कि हालांकि वे जिस भी बंधन को परिभाषित करते हैं, वह किसी भी चरण-दर-चरण कोड से पहले निर्मित होता है, यह तब तक सुलभ नहीं होता जब तक कि यह कथन letया constकथन तक नहीं पहुंच जाता।
इसलिए जब यह चलता है:
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वस्तु बहुत, बहुत गुण से भरा हुआ हो जाता है। जब भी संभव हो, दृढ़ता से गंदगी को न जोड़ने की सलाह दें। इसके बजाय, अपने प्रतीकों को एक छोटे पैकेज में लपेटें और ऑब्जेक्ट को अधिकतम एक प्रतीक पर निर्यात करें 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बांधना ES प्रजाति में नहीं है और इसलिए इसमें काम नहीं करेगा, उदाहरण के लिए, V8 या Node.js, जबकि this.a = 0;(वैश्विक निष्पादन संदर्भ में आह्वान किया गया) किसी भी वातावरण में काम करेगा क्योंकि कल्पना निर्दिष्ट नहीं करती है वहाँ होना चाहिए कि एक वैश्विक वस्तु। यदि आप अपने कोड को IIFE में ऑफ़-टॉपिक सेक्शन में लपेटते हैं , तो आप 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
क्या कोई वैश्विक वस्तु है जिसे सभी संस्करण डिफ़ॉल्ट रूप से बंद कर दिए जाते हैं? उदाहरण: 'globals.noVar घोषणा'
window.*घोषणा का उपयोग करने के लिए निश्चित गाइड । यह घोषणा आपके कोड को कॉपी-पेस्ट करने के मुकाबले सबसे सुरक्षित लगती है, और स्पष्ट भी।
के उत्कृष्ट जवाब पर bassed टीजे Crowder : ( विषय से संबंधित नहीं: बचें अव्यवस्था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
}());
हमेशा बंद का उपयोग करें और हमेशा वैश्विक स्तर पर लहराएं जब इसकी बिल्कुल नेकसेरी हो। आप वैसे भी अपने अधिकांश संचार के लिए अतुल्यकालिक घटना से निपटने का उपयोग करना चाहिए।
जैसा कि @AvianMoncellor ने उल्लेख किया है कि एक IE बग var a = fooकेवल फ़ाइल स्कोप के लिए एक वैश्विक घोषित करने के साथ है। यह IE के कुख्यात टूटे हुए दुभाषिया के साथ एक मुद्दा है। यह बग परिचित ध्वनि करता है इसलिए यह शायद सच है।
इसलिए से चिपके रहे window.globalName = someLocalpointer
deleteएक var)।
var। वे बस पूरी तरह से अलग तंत्र हैं जिनका एक ही व्यावहारिक परिणाम है। :-)
varगुंजाइश के बंद होने के लिए कूदता है।