1

JavaScript では、さまざまな方法で関数を定義できます。

function BatmanController () {
}

var BatmanController = function () {
}

// If you want to be EVIL
eval("function BatmanController () {}");

// If you are fancy
(function () {
    function BatmanController () {
    }
}());

偶然、今日、予期しない動作に出くわしました。function と同じ名前のローカル変数を (派手な方法で) 宣言すると、ローカル変数はローカル スコープ内に存在します。例えば:

(function () {
    "use strict";

    function BatmanController () {
    }

    console.log(typeof BatmanController); // outputs "function"

    var RobinController = function () {
    }

    console.log(typeof RobinController); // outputs "function"

    var JokerController = 1;
    function JokerController () {

    }
    console.log(typeof JokerController); // outputs "number", Ehm what?
}());

var JokerControllerによって上書きされない理由を知っている人はいますfunction JokerControllerか? Chrome、Safari、Canary、Firefox でこれをテストしました。これは、V8 および JägerMonkey エンジンで行われた「先読み」JavaScript の最適化によるものだと思います。しかし、この動作を説明する技術的な説明はありますか?

4

2 に答える 2

4

関数と変数の宣言は、それらが発生するスコープの先頭に引き上げられるため、代入はその場で発生します。コードは次のように効果的に解釈されます。

(function () {
    "use strict";

    function BatmanController () {} // Declarations are hoisted
    function JokerController () {}

    var RobinController, // Declarations are hoisted
        JokerController;

    RobinController = function () {} // Assign function to RobinController

    // outputs "function" (declaration was hoisted to top of scope)
    console.log(typeof BatmanController);

    // outputs "function" (assignment of number hasn't happened yet)
    console.log(typeof RobinController);

    JokerController = 1; // Assign number to JokerController

     // outputs "number" (assignment of number has now happened)
    console.log(typeof JokerController);
}());

完全な技術的詳細については、仕様のセクション 10.5を読むことをお勧めします。

于 2012-10-31T10:53:01.510 に答える
1

関数を宣言する方法JokerControllerにより、関数定義がスコープの先頭に引き上げられます。つまり、実際に実行されるコードは次のようになります。

 function JokerController (){}
 var JokerController = 1;

関数を変数に参照/代入される無名関数オブジェクトとして宣言する場合、関数定義は式の一部であるため、現在のスコープの先頭に引き上げることはできません。

MDN の Function というタイトルの段落を参照してください

于 2012-10-31T11:02:23.867 に答える