14
function g () {
    var x;
    function y () {};
    var z;
}

上記のコードが巻き上げられたときにどのような順序になるかを正確に知りたいです。

理論 1:var s とs の間の順序はfunctionそのままです:

function g () {
    var x;
    function y () {};
    var z;
}

理論 2: var s は s の前に来るfunction:

function g () {
    var x;
    var z;
    function y () {};
}

理論 3: function s は s の前に来るvar:

function g () {
    function y () {};
    var x;
    var z;
}

正しい理論はどれ?

4

2 に答える 2

24

ECMAScript 5 のセクション 10.5に従って、最初に関数が巻き上げられ、次に変数宣言が行われ、巻き上げの方法が指定されます。

最初に、関数宣言を処理するステップ 5 があります。

コード内の FunctionDeclaration f ごとに、ソース テキストの順序で...

次に、ステップ 8 でvar宣言を処理します。

コード内の VariableDeclaration および VariableDeclarationNoIn d ごとに、ソース テキストの順に実行します。

varしたがって、後のvarステートメントは以前に処理された関数宣言を上書きできないため、関数にはステートメントよりも高い優先順位が与えられます。(サブステップ 8c は「If varAlreadyDeclared is false, then [continue...]」という条件を適用するため、既存の変数バインディングは上書きされません。)

これを実験的に確認することもできます:

function f(){}
var f;
console.log(f);

var g;
function g(){}
console.log(g);

どちらlogの呼び出しも、undefined値ではなく関数を示しています。

于 2015-01-31T00:06:41.540 に答える