2013-02-28 8 views
6

परीक्षण क्रोम देव में कुछ js कोड कंसोल और मैं थोड़ा उलझन में हूँ।जावास्क्रिप्ट 'सख्त उपयोग'; अंदर कार्यों

मुझे पता है कि सख्त मोड कार्यों है कि एक वस्तु के तरीकों जब करने के लिए भेजा नहीं कर रहे हैं में इस कीवर्ड वैश्विक वस्तु के स्थान पर अपरिभाषित प्राप्त करना चाहिए।

function test(){ 
    "use strict"; 
    return this===undefined;} 
test(); 

आउटपुट झूठी

"use strict"; 
function test(){ 
    return this===undefined;} 
test(); 

फिर भी झूठी

(function test(){ 
    "use strict"; 
    return this===undefined;}()); 

आउटपुट सच

बस स्पष्ट करने के लिए करना चाहता था। ʕ • ᴥ • ʔ मैं जेएस के लिए नया हूँ।

+2

कृपया एक समान प्रश्न पढ़ें http://stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it – hexblot

+4

@hexblot यह सवाल का जवाब नहीं देता है ... – Christoph

उत्तर

2

यह क्रोमियम डेवलपर कंसोल में एक बग है जो अभी भी वैश्विक ऑब्जेक्ट को संदर्भित करने के लिए this का कारण बनता है। वही कोड स्थान बार में और दस्तावेज़ों में javascript: के साथ निर्दिष्ट के रूप में कार्य करता है।

आपको लगता है कि परीक्षण कर सकते हैं की तरह तो (2 सांत्वना आदानों):

var global = (function() { return this; }()); 

"use strict"; 
function test() { return this === global; } 
test(); 

और (एक या अधिक सांत्वना आदानों)

var script = document.createElement("script"); 
script.type = "text/javascript"; 
script.appendChild(document.createTextNode(
    'function test() { "use strict"; return this === undefined; }; console.log(test());' 
)); 
document.body.appendChild(script); 

क्रोमियम संस्करण 25.0.1364.97 डेबियन 7.0 में परीक्षण किया गया (183,676) ।

+0

आपका पहला परीक्षण एक टूटा परीक्षण है। यहां तक ​​कि यदि आप इसे कंसोल की बजाय स्क्रिप्ट टैग में चलाते हैं, तो भी आपको 'सत्य' मिलेगा, क्योंकि "सख्त उपयोग करें" 'इसके पहले दायरे में * पहली * रेखा होनी चाहिए। आपका उदाहरण 'var global ...' के बाद आ रहा है, इसलिए निर्देश को अनदेखा किया गया है (spec के अनुसार)। –

+0

@NathanWall नहीं, मेरी स्पष्टीकरण देखें। मेरा सुझाव है कि आप कॉल स्टैक का निरीक्षण करने के लिए फ़ंक्शन में 'डीबगर;' का उपयोग करें। – PointedEars

2

सब कुछ ठीक। यदि आप कुछ एचटीएमएल पेज (देव कंसोल नहीं) के माध्यम से अपना कोड चलाते हैं, तो परिणाम उम्मीदों को पूरा करते हैं (हमेशा this===undefined)।

साथ ही क्षेत्र में नवीनतम फ़ायरफ़ॉक्स (Firebug):

function test(){ 
    "use strict"; 
    return this===undefined;} 
test(); 
>> true 

तो यह सिर्फ एक और क्रोम के बग प्रतीत हो रहा है (सुविधा?)। ऐसा लगता है कि यह dev console के माध्यम से पारित कोड के लिए थोड़ा अलग दृष्टिकोण है।

भी ध्यान रखें कि आदेश मामलों:

<script> 
    console.log('Me First!'); 

    "use strict"; 

    function test(){ 
     console.log(this); 
    } 
    test(); 

</script> 

>>> "Me First!" 
>>> Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…} 

लेकिन:

<script> 
    "use strict"; 

    console.log('Me later!'); 

    function test(){ 
     console.log(this); 
    } 
    test(); 

</script> 

>>> undefined 
>>> "Me later!" 
4

क्या आपने गौर किया बस रास्ते से एक पक्ष प्रभाव डेवलपर कंसोल काम करता है। जब आप कोड वहाँ दर्ज करें, यह प्रभावी रूप से है कि क्या होता है (अधिक जानकारी के लिए this answer देखें):

eval.call(null, "with (window) { \ 
        function test() { \ 
         'use strict'; \ 
         console.log(this); \ 
        } test(); \ 
       }"); 

यह eval के लिए एक अप्रत्यक्ष कॉल, (में यह हमेशा वैश्विक निष्पादन संदर्भ में निष्पादित करेंगे जिसका मतलब है कि है ब्राउज़र, यह window है)।

प्रभावी ढंग से, समारोह वैश्विक वस्तु के लिए बाध्य है और इसलिए this, वैश्विक ऑब्जेक्ट के संदर्भ रखती है के रूप में यदि आप एक वेब पेज (बजाय कंसोल में) में ऐसा किया:

function test(){ 
    "use strict"; 
    return this === undefined; 
} 

test(); // true 
test.call(window); // false 
+1

'ऑब्जेक्ट' * द्वारा संदर्भित एक वस्तु * * * निष्पादन संदर्भ नहीं है। एक निष्पादन संदर्भ एक सार कार्यक्रम इकाई है; इसमें वस्तुओं के साथ एक * स्कोप चेन * है। इस मामले में, यह 'साथ 'कथन होगा जो' test() 'कॉल के संदर्भ के लिए स्कोप श्रृंखला में' विंडो' द्वारा निर्दिष्ट ऑब्जेक्ट को सम्मिलित करता है। – PointedEars

+0

@PointedEars - हां, ज़ाहिर है। मैं कह सकता था "शब्दावली पर्यावरण का पर्यावरण रिकॉर्ड जिस पर 'विंडो' ऑब्जेक्ट संबंधित है" लेकिन जिस तरह से मैंने इसे रखा था वह आसान था और मुझे लगता है कि अभी भी बिंदु पूरी हो गई है। और 'के साथ' कथन इस मामले में कोई फर्क नहीं पड़ता - यह तरीका है कि 'eval' कहा जाता है जो उस संदर्भ को प्रभावित करता है जिसमें इसके तर्क का मूल्यांकन किया जाता है। –

+0

'साथ' कथन यहां * पर्याप्त * हो सकता है; यह निश्चित रूप से है यदि आप मानते हैं (आईएमओ गलती से) कि वैश्विक वस्तु की 'विंडो' मेजबान संपत्ति हमेशा वैश्विक वस्तु को संदर्भित करती है। क्योंकि तब 'test() 'कॉल' global.window.test() 'के बराबर होगा, जहां वैश्विक वस्तु के मानक संदर्भ के लिए' वैश्विक' स्टैंड-इन होगा। – PointedEars

संबंधित मुद्दे