एक अंतर है ।
var x = 1
x
वर्तमान दायरे (उर्फ निष्पादन संदर्भ) में चर घोषित करता है । यदि एक फ़ंक्शन में घोषणा प्रकट होती है - एक स्थानीय चर घोषित किया जाता है; यदि यह वैश्विक दायरे में है - एक वैश्विक चर घोषित किया गया है।
x = 1
दूसरी ओर, केवल एक संपत्ति असाइनमेंट है। यह पहले x
गुंजाइश श्रृंखला के खिलाफ हल करने की कोशिश करता है । यदि यह उस दायरे की श्रृंखला में कहीं भी पाया जाता है, तो यह असाइनमेंट करता है; यदि यह नहीं मिलता है x
, तो केवल यह x
एक वैश्विक वस्तु पर संपत्ति बनाता है (जो एक गुंजाइश श्रृंखला में एक शीर्ष स्तर की वस्तु है)।
अब, ध्यान दें कि यह एक वैश्विक चर घोषित नहीं करता है, यह एक वैश्विक संपत्ति बनाता है।
दोनों के बीच का अंतर सूक्ष्म है और भ्रामक हो सकता है जब तक कि आप यह नहीं समझते कि परिवर्तनीय घोषणाएं भी (केवल एक चर वस्तु पर) गुण पैदा करती हैं और यह कि जावास्क्रिप्ट (अच्छी तरह से, ECMAScript) में प्रत्येक संपत्ति में कुछ झंडे होते हैं जो उनके गुणों का वर्णन करते हैं - Readlyly, DontEnum और DontDelete।
चूँकि परिवर्तनीय घोषणा DontDelete ध्वज के साथ संपत्ति बनाती है, ( var x = 1
और x = 1
जब वैश्विक दायरे में निष्पादित) के बीच का अंतर यह है कि पूर्व एक - चर घोषणा - DontDelete'able संपत्ति बनाता है, और बाद वाला नहीं करता है। परिणामस्वरूप, इस अंतर्निहित असाइनमेंट के माध्यम से बनाई गई संपत्ति को तब वैश्विक ऑब्जेक्ट से हटाया जा सकता है, और पूर्व एक - चर घोषणा के माध्यम से बनाया गया - हटाया नहीं जा सकता।
लेकिन यह सिर्फ पाठ्यक्रम का सिद्धांत है, और व्यवहार में दोनों के बीच और भी अधिक अंतर हैं , कार्यान्वयन में विभिन्न बगों के कारण (जैसे कि IE से)।
आशा है कि यह सब समझ में आता है:)
[अद्यतन 2010/12/16]
ES5 में (ECMAScript 5; हाल ही में मानकीकृत, भाषा का 5 वां संस्करण) एक तथाकथित "सख्त मोड" है - एक ऑप्ट-इन भाषा मोड, जो अघोषित असाइनमेंट के व्यवहार को थोड़ा बदल देता है। सख्त मोड में, अघोषित पहचानकर्ता को असाइनमेंट एक रेफरेंस है । इसके लिए तर्क यह था कि आकस्मिक कामों को पकड़ा जाए, अवांछित वैश्विक संपत्तियों के निर्माण को रोका जाए। कुछ नए ब्राउज़रों ने पहले से ही सख्त मोड के लिए समर्थन शुरू कर दिया है। उदाहरण के लिए, मेरी कंप्यूटर तालिका देखें ।