2012-10-08 15 views
5

पर निर्यात नहीं कर सकता है मान लीजिए मेरे पास निम्न स्क्रिप्ट है, जिसे include_strict.js कहा जाता है। यह कार्यान्वित करने के बाद मैं window.global1 परिभाषित होना चाहिए:"सख्त उपयोग करें"; + jQuery.getScript() = स्क्रिप्ट वैश्विक नेमस्पेस

"use strict"; 

var globalVar = {}; 
alert(typeof window.globalVar); 

लेकिन अगर मैं यह जावास्क्रिप्ट के एक ब्लॉक से शामिल

$.getScript("include_strict.js"); 

साथ चेतावनी कहते हैं undefined। क्यूं कर? यहाँ क्या हो रहा है?

<script type="text/javascript" src="include_strict.js"></script> 

यहाँ, मैं उम्मीद अलर्ट दिखाई दे, object:

FYI करें, कि अगर मैं फ़ाइल एक स्क्रिप्ट टैग का उपयोग शामिल है कि क्या होता है नहीं है। और यदि मैं "use strict"; हटा देता हूं, तो jQuery.getScript() और <script>; दोनों object प्रदर्शित करने का समान प्रभाव रखते हैं।

मैंने इसे प्रदर्शित करने के लिए एक उदाहरण (https://docs.google.com/file/d/0B-XXu97sL1Ckb0x0OHptTmVMY00/edit) बनाया है।

उत्तर

11

यह $.getScript() जो eval का उपयोग करता स्क्रिप्ट जो कठोर मोड में वैश्विक क्षेत्र संशोधित नहीं कर सकते निष्पादित करने के लिए उपयोग करता है:

दूसरा, सख्त मोड कोड आसपास के दायरे में नए चर परिचय नहीं करता है eval। सामान्य कोड में eval("var x;") आसपास के फ़ंक्शन या वैश्विक दायरे में एक चर x को प्रस्तुत करता है। इसका अर्थ यह है कि, सामान्य रूप से, प्रत्येक नाम को निकालने के लिए कॉल वाले किसी फ़ंक्शन में किसी तर्क या स्थानीय चर के संदर्भ में किसी विशेष परिभाषा के लिए मैप किया जाना चाहिए (क्योंकि उस eval ने एक नया चर प्रस्तुत किया हो सकता है जो बाहरी चर को छुपाएगा)। सख्त मोड में eval केवल कोड मूल्यांकन किया जा रहा के लिए चर बनाता है, इसलिए eval को प्रभावित नहीं कर सकते हैं कि एक नाम एक बाहरी चर या कुछ स्थानीय चर को दर्शाता है:

स्रोत: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode

समाधान का उपयोग नहीं कर रहा है jQuery को स्क्रिप्ट लोड करने के लिए, लेकिन script तत्व को DOM में जोड़ना। ध्यान दें कि आप तत्व को जोड़ने के लिए jQuery का भी उपयोग नहीं कर सकते हैं; यह स्वचालित रूप से इसके लिए $.getScript() का उपयोग करेगा।

+0

तुम मुझे कुछ सेकंड ;-) – Prinzhorn

+0

बहुत दिलचस्प द्वारा हराया। मैं पहली बार इस मुद्दे पर आया और यह पूरी तरह से समझ में आता है। मेरी समस्या यह है कि मुझे लोड होने के बाद कई स्क्रिप्ट निष्पादित करने की आवश्यकता है, इसलिए मुझे यह जानने की आवश्यकता है कि अगली स्क्रिप्ट जोड़ने से पहले स्क्रिप्ट लोड हो गई है। क्या मुझे यह जानने का कोई तरीका है कि जब स्क्रिप्ट को डीओएम में जोड़ने की विधि का उपयोग किया जाता है तो एक स्क्रिप्ट लोड हो जाती है? होगा .load() काम? – Redtopia

2

jQuery eval स्क्रिप्ट का उपयोग करता है। "सख्त उपयोग करें;" eval के अंदर कोड के अर्थशास्त्र बदलता है। यही कारण है कि सख्त मोड खतरनाक हो सकता है! क्योंकि ब्राउज़र में जो इसका समर्थन नहीं करते हैं, आपका कोड कुछ और करता है।

दूसरा, सख्त मोड कोड का eval आसपास के दायरे में नए चर परिचय नहीं करता है। सामान्य कोड eval ("var x;") में एक चर एक्स को आसपास के फ़ंक्शन या वैश्विक दायरे में प्रस्तुत करता है। इसका अर्थ यह है कि, सामान्य रूप से, प्रत्येक नाम को निकालने के लिए कॉल वाले किसी फ़ंक्शन में किसी तर्क या स्थानीय चर के संदर्भ में किसी विशेष परिभाषा के लिए मैप किया जाना चाहिए (क्योंकि उस eval ने एक नया चर प्रस्तुत किया हो सकता है जो बाहरी चर को छुपाएगा)। सख्त मोड eval में केवल कोड के मूल्यांकन के लिए चर बनाता है, इसलिए eval किसी बाहरी चर या कुछ स्थानीय चर को संदर्भित करता है या नहीं, यह प्रभावित नहीं कर सकता है।

https://developer.mozilla.org/en/JavaScript/Strict_mode

समाधान window.foo = "bar;" बजाय var foo = "bar"; उपयोग करने के लिए है। और आपको अपना कोड आईआईएफई के अंदर "सख्त उपयोग" करने के लिए रखना चाहिए अधिक अनुमानित

(function(window) { 
    "use strict"; 

    window.globalVar = {}; 
    alert(typeof window.globalVar); 
}(window)); 
+0

यह वही नहीं है जो मुझे चाहिए था, लेकिन यह मुझे 'क्लिक' बना दिया - बहुत बहुत धन्यवाद! :) –

0

प्रक्रिया प्रतिक्रिया सख्त मोड को हटाने से पहले निष्पादित करें:

$.ajax({ 
    url: scriptUrl, 
    dataType: "script", 
    dataFilter: function (data, type) { 
     return data.replace("\'use strict\';", ""); 
    } 
}); 
संबंधित मुद्दे