2015-05-18 8 views
5

के बीच अजीब बातचीत क्या कोई कारण है कि कोड की यह पंक्ति विफल क्यों होनी चाहिए?नए फंक्शन और eval

new Function("eval('function foo(){ alert() }'); foo()")() 

यह क्रोमियम में एक चेतावनी के रूप में उम्मीद दिखाई दे, लेकिन (foo परिभाषित नहीं है) फ़ायरफ़ॉक्स में विफल रहता है। क्या यह फ़ायरफ़ॉक्स बग है, या मेरे कोड में कुछ गड़बड़ है?

+0

यह एक सख्त/गैर सख्त मोड की तरह लगता है - क्या आप _sure_ हैं, आप दोनों को गैर-सख्त मोड में चलाया है? (क्रोम का व्यवहार) या सख्त मोड (फ़ायरफ़ॉक्स)? (अपडेट: इस स्पेस को देखकर यह एक एएस 5 बनाम es2015 (es6) चीज हो सकता है) –

+0

@ बेंजामिनग्रेनबाम मैंने इसके बारे में सोचा। मुझे यकीन है कि मैं दोनों गैर-प्रतिबंधित मोड में भाग गया। लेकिन सख्त मोड का कोई प्रभाव नहीं होना चाहिए, क्योंकि नए फ़ंक्शन को प्रतिबिंबित नहीं करना चाहिए (नियमित फ़ंक्शन के विपरीत)। – user2345215

+0

हालांकि यह दिलचस्प है कि ब्राउज़र अलग-अलग व्यवहार करते हैं, फिर भी मुझे आश्चर्य है कि "हम क्यों परवाह करते हैं?" एक्सडी –

उत्तर

-1

समस्या यह है कि eval वैश्विक दायरे का वारिस नहीं करता है, इसलिए foo इसे कहां कहा जा रहा है उससे अलग दायरे में बनाया गया है। आप कार्य परिभाषा पर या eval पर जाकर स्पष्ट रूप से दायरे को निर्दिष्ट करके इसे हल कर सकते हैं। अर्थात। निम्नलिखित के टुकड़े के दोनों अपेक्षित तरीके से:

new Function("eval('window.foo = function(){ alert() }'); foo()")() 

new Function("eval('function foo(){ alert() }', this); foo()")() 

यह व्यवहार, सख्त मोड से संबंधित माना जाता, जैसा कि यहाँ "use strict"; + jQuery.getScript() = script can't export to global namespace जवाब से समझाया है।

+1

'eval' का उद्देश्य वैश्विक दायरे का उपयोग करने का इरादा नहीं है, लेकिन उस से स्थानीय फ़ंक्शन का दायरा जिसे (और उस 'foo()' कहा जाता है) कहा जाता है। इसके अलावा आपका दूसरा स्निपेट समझ में नहीं आता है, 'eval' एक दूसरा पैरामीटर नहीं लेता है। – Bergi

+0

यह वास्तव में https://dev.mozilla.jp/localmdc/localmdc_3355.html करता है। हालांकि दूसरे तर्क को बहिष्कृत किया गया प्रतीत होता है, इसलिए इसे लागू करने पर भरोसा नहीं करना चाहिए (हालांकि मैंने इसे फ़ायरफ़ॉक्स के नवीनतम संस्करण में परीक्षण किया है और यह काम करता है) – taddeus