(1,eval)
और सादे पुराने eval
के बीच अंतर यह है कि पूर्व एक मूल्य है और बाद एक lvalue है देखें। अगर यह कुछ अन्य पहचानकर्ता थे यह और अधिक स्पष्ट होगा:
var x;
x = 1;
(1, x) = 1; // syntax error, of course!
है (1,eval)
एक अभिव्यक्ति है कि eval
(कहते हैं कि बस के रूप में, (true && eval)
या (0 ? 0 : eval)
होगा) पैदावार है, लेकिन यह eval
के लिए एक संदर्भ नहीं है।
आपको परवाह क्यों है?
खैर, ऐक्मा कल्पना एक संदर्भeval
समझता "प्रत्यक्ष eval कॉल" हो सकता है, लेकिन एक अभिव्यक्ति है कि केवल eval
पैदावार एक अप्रत्यक्ष एक होने के लिए - और अप्रत्यक्ष eval कॉल वैश्विक क्षेत्र में निष्पादित करने के लिए गारंटी दी जाती है ।
बातें मैं अभी भी पता नहीं है:
- क्या परिस्थिति में एक सीधा eval कॉल नहीं वैश्विक क्षेत्र में निष्पादित करता है?
- वैश्विक परिस्थिति में एक समारोह के
this
किस परिस्थिति में वैश्विक वस्तु उत्पन्न नहीं कर सकता है?
कुछ और जानकारी here मिल सकती है।
संपादित
जाहिर है, मेरा पहला सवाल का जवाब है, "लगभग हमेशा"। वर्तमान स्कोप से सीधे eval
निष्पादित करता है। निम्नलिखित कोड पर विचार करें:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
नहीं आश्चर्यजनक रूप से (हे-हे), इस बाहर प्रिंट:
direct call: inner
indirect call: outer
संपादित
अधिक प्रयोग के बाद, मैं प्रावधिक कहना है कि जा रहा हूँ this
को null
या undefined
पर सेट नहीं किया जा सकता है। इसे अन्य झूठी मानों (0, '', NaN, false) पर सेट किया जा सकता है, लेकिन जानबूझकर बहुत पर जा सकता है।
मैं कहने जा रहा हूं कि आपका स्रोत हल्के और उलटा क्रैनियो-रेक्टल उलटापन से पीड़ित है और होस्केल में एक सप्ताह का प्रोग्रामिंग करने पर विचार करना चाह सकता है।
मैंने शीर्षक अपडेट किया है क्योंकि यह एक विशिष्ट मामला है। इसके अलावा, * ब्रैकेट्स *: [] और {} विशिष्ट प्रकार के लिए * कोष्ठक * अलग-अलग हैं :) –