5

編集 それは私の側の問題であり、私のjsfiddleの使用法だったようです:?

最近ホイストに関する記事をいくつか読んでいます。1 つはNicholas Zakas によるもので、もう 1 つはBen Cherry によるものです。

私は例に従って、自分でテストして完全に理解していることを確認しようとしていますが、主にこの例に問題があります。

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

undefinedそのログを記録する代わりに1。私がすべてを正しく理解している場合は、 var ステートメントが一番上に持ち上げられているため、ウィンドウスコープに存在する必要aundefinedあるため、値を割り当てる必要はありません。

しかし、以下は期待どおりに動作しています。

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

fooでありundefinedbaz定義されていません。両方の例でここにフィドルがあります。本当にこれについて頭を包み込もうとしているだけです。これらの記事を書いてから、何か変わったことはありますか? 誰かがこれに光を当てることができれば、それはありがたいです. テスト時にChrome 14を使用しています。

4

5 に答える 5

7

wrapフィドルのをに変更しますno wrap(head)

http://jsfiddle.net/rlemon/VjCqF/3/

于 2011-09-22T14:17:30.847 に答える
2

JSFiddle が に設定されているonLoadためvar a、 onLoad 関数にスコープが設定されています。に変更すると、次のようにno wrapなります。

undefined
undefined
Uncaught ReferenceError: baz is not defined
于 2011-09-22T14:21:21.753 に答える
2

2 番目の例では、巻き上げによってコードが次のように変換されます。

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

そのため、log への最初の呼び出しでは foo は未定義です。宣言は常にそれを囲む関数の先頭に引き上げられますが、代入は一緒に引き上げられることはありません。

于 2011-09-22T14:19:49.850 に答える
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
于 2011-09-22T14:20:54.413 に答える
0

ホイストの理解は異なりますが、私の理解では、それが何をするのかは

変数/関数を作成するたびに、メモリ空間が設定されます。実行コンテキストの一番上に変数/関数は配置されません。

コンソールに「this/window」と入力すると、変数/関数が字句的にそこに座っていることがわかります。

例えば:

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

実行中に最上位に配置された場合、「未定義」関数ではなく「Hello」が出力されます。変数は実行されません。変数が宣言された後、vars を巻き上げて実行することは避けてください。

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

b(); //returns Hello World   
于 2015-07-23T18:58:02.647 に答える