2011-09-22 11 views
5

jsfiddleの私の使い方と私の使い方のように見えますか?JavaScriptホイストを完全に理解しようとしています

最近、吊り上げに関する記事が2つあります.1つはby Nicholas Zakas、もう1つはby Ben Cherryです。代わりにundefinedそのログ1を伐採、

if (!('a' in window)) { 
    var a = 1; 
} 
console.log(a); 

を、私は完全にそれを把握することを確認するために私自身の例とちょうどテストを追跡しようとしているが、イムは、この例で主に問題を持つ

イム。すべてが正しく理解されている場合、はとなるはずです。これは、varステートメントが上部に持ち上げられているため、ウィンドウスコープにはが存在するはずなので、値を割り当てるべきではありません。

(function bar(){ 
    console.log(foo); 
    var foo = 10; 
    console.log(baz); 
})(); 

foo

しかし、予想通り、以下が機能しているが、undefinedあり、そしてbazが定義されていません。私は両方の例でfiddleをここに持っています。本当にこの周りに私の頭を包み込むことを試みるだけです。これらの記事が多分書かれて以来、何か変わったのですか?誰かがこれにいくつかの光を当てることができればそれは認められるだろう。私はテスト時にChrome 14を使用しています。

+0

私はGoogle Chromeであなたのフィドルを実行していることだし、それは 'undefined'を印刷します: 、それが宣言された後VARSをexcute巻き上げ避けてください。ホイストの良い説明については、* O'Reilly JavaScript Patterns *をご覧ください。 専用の**段落**があります。 – user278064

+0

ええ、明らかに私はjsfiddleを正しく使っていないためにdohでした。 – Loktar

答えて

2

に、巻上げは、この中にコードを変換:

(function bar(){ 
    var foo; 
    console.log(foo); 
    foo = 10; 
    console.log(baz); 
})(); 

したがってfooがログインする最初の呼び出し時に定義されています。宣言は常に囲み関数の先頭に持ち込まれますが、代入は決してその関数に乗ることはありません。

+0

私はあなたが誤植をしたと思います。 – pimvdb

+0

ええ、少し – dtanders

1

object.a === undefined; // trueが、a in object; // true

var object = {a: undefined}; 

('a' in object); // is true because a is a property of object 
2

あなたはJSFiddleはonLoadに設定されているので、var aはonLoadの機能にスコープされます。 no wrapにそれを変更し、あなたが得る:巻き上げが異なって理解していますが/変数の関数を作成するたびに私の理解にどのようなことがないこと

です

undefined 
undefined 
Uncaught ReferenceError: baz is not defined 
0

それはyou.Itのためのメモリ空間を設定しません変数/関数を実行コンテキストの先頭に置きます。

コンソールに 'this/window'と入力すると、var/functionsが字句的に表示されます。例えば

a; //returns undefined 
b(); //returns Hello World 
var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 

それは実行時に一番上に配置されている場合は、それを出力する「こんにちは」は「未定義」の機能がexcuted.Variablesはexcuted取得することはできませんれますべきではありません。

var a = "Hello"; 
    function b() { 
     console.log('Hello World'); 
    } 
a; //returns Hello 

b(); //returns Hello World 
関連する問題