2013-02-28 24 views
6

Bazı js kodu Chrome Dev Console'da test edildi ve biraz kafam karıştı.JavaScript 'kullanımı'; iç işlevleri

Ben düzey modu anılacaktır zaman bir nesnenin yöntemleri değildir fonksiyonları bu kelime yerine küresel nesne tanımsız alması gerektiğini biliyoruz.

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

Çıkışlar yanlış.

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

Hala yanlış.

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

Çıkışlar gerçek.

Sadece açıklığa kavuşturmak istedim. ʕ • ᴥ • j js için yeniyim.

+2

lütfen benzer bir soru okuyun http://stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it – hexblot

+4

@hexblot Bu soruya cevap vermiyor ... – Christoph

cevap

2

It Chromium Developer Console'da this'un hala genel nesneye başvurmasına neden olan bir hatadır. Aynı kod, konum çubuğunda ve belgelerde javascript: ile belirtilen şekilde çalışır.

Bunu test edebilirsiniz gibi pek (2 konsol giriş):

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

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

ve (bir veya daha fazla konsol girişler)

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); 

Krom Sürüm 25.0.1364.97 Debian 7.0 Test (183676) .

+0

İlk testiniz kırık bir testtir. Bunu konsol yerine bir komut dosyası etiketinde çalıştırsanız bile, yine de "true" ifadesini alacaksınız, çünkü "kullanacağınız" ifadesi, * kapsamındaki * ilk * satır olmalıdır. Örneğiniz 'var global ...' den sonra geliyor, bu yüzden yönerge gözardı ediliyor (spesifikasyona göre). –

+0

@NathanWall Hayır, açıklamama bakın. Çağrı yığınını denetlemek için 'debugger 'işlevini kullanmanızı öneririm. – PointedEars

2

Her şey yolunda. Kodunuzu bir HTML sayfası (dev bir konsol değil) aracılığıyla çalıştırırsanız, sonuçlar beklentileri karşılar (her zaman this===undefined).

Ayrıca son Firefox (Kundakçı):
function test(){ 
    "use strict"; 
    return this===undefined;} 
test(); 
>> true 

Yani bu sadece başka Chrome'un hata olduğunu tahmin etmekteyiz (özellik?). Dev konsol üzerinden geçirilen kodda biraz farklı bir yaklaşım varmış gibi geliyor.

<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…} 

Ama:

<script> 
    "use strict"; 

    console.log('Me later!'); 

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

</script> 

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

Ne fark etmiş basitçe şekilde bir yan etkisi geliştirici konsolu çalışmaları olduğunu

Ayrıca sipariş konularda dikkat edin. Orada kodunu girdiğinizde bu (daha fazla ayrıntı için this answer bakınız) ne olur etkin bir geçerli:

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

Bu o zaman küresel yürütme bağlamında yürütmek anlamına gelir eval bir dolaylı çağrı, (olduğu tarayıcı, bu window).

Etkili, fonksiyon küresel nesneye bağlanır ve (ziyade konsolunda) bir web sayfasında bunu sanki bu nedenle this, küresel nesneye bir başvuru içerir:

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

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

'window' * ile atıfta bulunulan bir nesne * * * * yürütme bağlamı değildir. Bir yürütme bağlamı soyut bir program varlığıdır; İçinde nesneleri olan bir * kapsam zincirine * sahiptir. Bu durumda, 'window' ile belirtilen nesneyi, 'test()' çağrısı bağlamı için kapsam zincirinde ekleyen 'with' ifadesi olur. – PointedEars

+0

@PointedEars - Evet, tabiki. "Pencerenin nesnesinin ait olduğu çevre ortamının çevre kaydı" diyebilirdim ama benim koyduğum şekil daha kolaydı ve bence bu noktaya hâlâ rastlıyor. Ve 'with' ifadesi bu durumda hiçbir fark yaratmaz - argümanının değerlendirildiği bağlamı etkileyen 'eval' denen yoldur. –

+0

"with" ifadesi burada * önemli olabilir; (IMO yanlışlıkla), genel nesnenin 'window' host özelliğinin her zaman global nesneyi ifade ettiğini varsayalım. Çünkü o zaman 'test() 'çağrısı global.window.test()' ile eşdeğerdir; burada global' global 'standart nesneye yönelik bir referans olarak kabul edilir. – PointedEars

İlgili konular