आप कभी भी पढ़ सकते हैं वेरिएबल जिन्हें घोषित नहीं किया गया है, और यही वह है जो आप पिछले मामले में _gaq || []
अभिव्यक्ति के साथ प्रयास कर रहे हैं।
इस मामले
_gaq = _gaq || [];
_qaq
में से पहले घोषित नहीं किया गया है और जब दाहिने हाथ की ओर (_gaq || []
) का मूल्यांकन किया जाता है, यह त्रुटि फेंकता है।
यहाँ क्या इस मामले में हो रहा है के कदम विवरण द्वारा कदम है:
असाइनमेंट ऑपरेटर विनिर्देश के section 11.13.1 में वर्णित है:
The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression
is evaluated as follows:
1. Let lref
be the result of evaluating LeftHandSideExpression
.
2. Let rref
be the result of evaluating AssignmentExpression
.
...
LeftHandSideExpression
_gaq
है, AssignmentExpression
_gqa || []
है।
तो पहले _qaq
का मूल्यांकन किया गया है, जिसके परिणामस्वरूप unresolvable reference है, क्योंकि परिवर्तनीय _gaq
घोषित नहीं किया गया है। यह मूल्यांकन त्रुटि नहीं फेंकता है।
फिर _gqa || []
का मूल्यांकन किया गया है। यह एक LogicalORExpression
है और LogicalORExpression || LogicalANDExpression
रूप section 11.11 में वर्णित है।इस मामले में, LogicalORExpression
, बाएं हाथ की ओर, _gaq
और LogicalANDExpression
है, दाईं ओर, []
है।
1. Let lref
be the result of evaluating LogicalORExpression
.
2. Let lval
be GetValue(lref)
.
...
हम पहले से ही जानते हैं कि lref
एक न सुलझा हुआ संदर्भ क्योंकि _gaq
घोषित नहीं किया गया था हो जाएगा:
अभिव्यक्ति के रूप में इस मूल्यांकन किया जाता है। तो देता है एक नज़र क्या GetValue
कर रही है है (section 8.7.1 में परिभाषित किया गया, V
मूल्य GetValue
के लिए पारित किया है):
1. If Type(V)
is not Reference
, return V
.
2. Let base
be the result of calling GetBase(V)
.
3. If IsUnresolvableReference(V)
, throw a ReferenceError
exception.
...
आप देख सकते हैं, एक ReferenceError
त्रुटि इस प्रक्रिया के तीसरे चरण में फेंक दिया जाता है, जिसमें असाइनमेंट के दाईं ओर मूल्यांकन करके निष्पादित किया जाता है, और यह वह जगह है जहां त्रुटि फेंक दी जाती है।
तो, यह var _gaq = _gaq || [];
के साथ क्यों नहीं होता है?
यह पंक्ति:
var _gaq = _gaq || [];
वास्तव में
var _gaq;
_gaq = _gaq || [];
कुछ
hoisting [MDN] कहा जाता है की वजह से
है। इसका मतलब है कि _gaq
का मूल्यांकन किया जाता है, तो यह परिणामस्वरूप अनारक्षित संदर्भ, लेकिन मूल्य undefined
के साथ संदर्भ है।
(यदि चर _gaq
पहले से ही घोषित किया जाता है (और संभवत: अपना महत्व होता है), तो var _gaq
कोई असर नहीं होगा।)
आप एक समारोह अंदर से विश्व स्तर पर _gaq
बनाने के लिए चाहते हैं, करते हैं
window._gaq = window._gaq || [];
वे बिल्कुल समान नहीं हैं, जब आप ['delete'] (http://perfectionkills.com/understanding-delete/) को करने का प्रयास करते हैं तो वे व्यवहार में भिन्न होते हैं। – Bergi
वैश्विक स्तर पर 'असाइन किए गए असाइनमेंट' का सर्वोत्तम स्पष्टीकरण और क्यों वे वैश्विक असाइनमेंट ('foo = 0'! =' Var foo = 0') के लिए अलग हैं) मैं यह देख सकता हूं ** [इस ब्लॉग पर] (http : //perfectionkills.com/understanding-delete/) ** जिसने मुझे आंतरिक अंतर को समझने में मदद की है। –