(1,eval)
पुराने और सादे पुराने के बीच अंतर यह eval
है कि पूर्व एक मूल्य है और उत्तरार्द्ध एक अंतराल है। यह अधिक स्पष्ट होगा यदि यह कुछ अन्य पहचानकर्ता थे:
var x;
x = 1;
(1, x) = 1;
यह (1,eval)
एक ऐसी अभिव्यक्ति है जो पैदावार eval
(जैसा कि कहती है, (true && eval)
या (0 ? 0 : eval)
करेगी), लेकिन यह एक संदर्भ नहीं है eval
।
तुम क्यो फिकर करते हो?
ठीक है, एक्मा कल्पना एक संदर्भ को eval
"प्रत्यक्ष eval कॉल" माना जाता है , लेकिन एक अभिव्यक्ति जो केवल eval
एक अप्रत्यक्ष होने के लिए पैदावार देती है - और अप्रत्यक्ष eval कॉल वैश्विक दायरे में निष्पादित करने की गारंटी है।
चीजें जो मुझे अभी भी नहीं पता हैं:
- किस परिस्थिति में एक प्रत्यक्ष निकासी कॉल वैश्विक दायरे में निष्पादित नहीं होती है?
this
वैश्विक दायरे में एक समारोह के लिए किस परिस्थिति में वैश्विक वस्तु का उत्पादन नहीं किया जा सकता है?
कुछ और जानकारी यहां दी जा सकती है ।
संपादित करें
जाहिर है, मेरे पहले सवाल का जवाब है, "लगभग हमेशा"। एक प्रत्यक्ष वर्तमान दायरे 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, असत्य) पर सेट किया जा सकता है, लेकिन केवल बहुत जानबूझकर।
मैं यह कहने जा रहा हूं कि आपका स्रोत एक हल्के और प्रतिवर्ती क्रेनियो-रेक्टल उलटा से पीड़ित है और हास्केल में एक सप्ताह की प्रोग्रामिंग पर विचार करना चाह सकता है।