4
function f() { return s; } // works fine though no `s` is defined yet !

var s=1;
f(); // 1

delete s;

var s=2;
f(); // 2 

(function() {
var s=3;
f(); // 2 and not 3 which means lexical scoping is at play (?)
})();

sまず、まだ定義されていない変数 ( ) を閉じることができます。レキシカル(静的)スコープが使用されている場合、それはどのように可能ですか?

s次に、元のを削除した後f()、新しい を見つけることができますs。これは、クロージャが参照やシンボル テーブル インデックスなどではなく、よりマシン レベルのものではなく、変数名にバインドされていることを意味しますか? sオリジナルが削除されているため、レキシカルスコープクロージャーからエラーがスローされると予想されます。新しいsは名前を再利用するだけで、元の とは何の関係もありませんs

そして第三に、s無名関数のスコープ内は によって使用されてf()いません。

4

2 に答える 2

3

まず、まだ定義されていない変数を閉じることができます...レキシカル(静的)スコープが使用されている場合、それはどのように可能ですか?

巻き上げ参照

次に、元の s を削除した後、f() は新しい s を見つけることができます。これは、クロージャが参照やシンボル テーブル インデックスなどではなく、よりマシン レベルのものではなく、変数名にバインドされていることを意味しますか? 元の s は削除であるため、 e レキシカル スコープ クロージャがエラーをスローすることを期待します。新しい は名前を再利用するだけで、元の とは何の関係もありません。

新しい s はなく、すべての宣言が巻き上げられます。最後に s は 1 つだけです。巻き上げは引き続き適用されます。

そして第三に、匿名関数スコープ内の s は f() によって使用されません。これは、実際にレキシカルスコープが機能していることを意味しますか?

はい、無名関数内の s はそれに対してローカルであり、この場合、クロージャーはグローバル s に対して形成されます。

于 2013-03-29T15:00:35.953 に答える
2

この例は次と同等です

var s;
function f() { return s; } // works fine though no `s` is defined yet !

s=1;
f(); // 1

delete s;

s=2;
f(); // 2 

(function() {
var s=3;
f(); // 2 and not 3 which means lexical scoping is at play (?)
})();

Javascript 変数の宣言は、そのスコープの先頭に持ち上げられてから宣言されます。次に、ユーザーが設定した場所に定義されます。そのため、関数スコープで宣言する前に JavaScript 変数を参照できます。

また、delete は通常、var で宣言されたオブジェクトではなく、オブジェクトのプロパティに使用されることに注意してください。この場合の削除は、閉鎖に関係なく効果がありません。ここでフィドルを参照してください:jsfiddle

于 2013-03-29T14:58:00.883 に答える