0

更新:元の質問に誤った仮定があったため、質問を書き直しました(未定義と思われる変数をすでに初期化したコンソールでコードを実行していました)。

意味あり:

var obj = { 'whichScope': a };
obj.whichScope; //"ReferenceError: a is not defined"

しかし、次の例でエラーが発生しないのはなぜでしょうか? また、2 行目が最初の行の前に実行されている場合、なぜ obj.whichScope が "After" に解決されないのでしょうか?

var obj = { 'whichScope': a };
var a = "After";
obj.whichScope; //"undefined"

前の例の "var a" が obj が初期化される前に実行される場合、'a = "After";' の任意の部分を実行します。obj が初期化される前にも実行されますか?

var a = "Before";
var obj = { 'whichScope': a };
a = "After";
obj.whichScope; //"Before"

whichScope が「a」を返す関数を参照する場合、最後の例では「After」に解決されます。

4

1 に答える 1

1

それを可変巻上げといいます。

参考文献:

変数 ( で宣言var) と関数は、スコープの先頭に引き上げられます。

技術的には、スクリプトは次のようになります。

var a;  // = undefined
var obj = { 'whichScope': a };
a = "After";

あなたの最初の例はあなたが言うことをしませんが。の値obj.whichScopeundefined、期待どおりです。

デモ: http://jsfiddle.net/pRQwK/

最後のステートメントについては、If whichScope refers to a function that returns 'a' then it does resolve to "After" in the second example.- の値がa(クロージャーによって) キャプチャされないためです。プロパティを設定すると、その値がすぐにキャプチャされます (クロージャーとは関係ありません)。

于 2013-04-12T20:25:05.877 に答える