4

これがどのように機能するかを理解しようとしています。まだ宣言されていない名前付きの Javascript 関数を参照すると、状況によっては機能します。しかし、関数リテラルを使用すると、そうではありませんが、 . で失敗することもありませんReferenceError

function works() {
    var works_ref = foo;
    function foo() {
        console.log('ok');
    };
    console.log('works ' + works_ref);
}

function fails() {
    var fails_ref = foo;
    var foo = function() {
        console.log('ok');
    };
    console.log('fails ' + fails_ref);
}

works();
fails();

これは戻ります

"works function foo() {
            console.log('ok');
        }"
"fails undefined"

最初の例がどのように機能するのか疑問に思っています.これはインタープリター言語であり、コンパイルされていないため、あらゆる種類の前方参照が失敗すると予想されます.2番目の例では、なぜReferenceError?

4

2 に答える 2

5
function foo() {
    console.log('ok');
};

これを関数宣言と呼びます。これはコンパイル時に処理されます。つまり、JavaScript は という関数があることを知っていますfoo。そのため、ここで関数オブジェクトを割り当てます

var works_ref = foo;

2番目のケースでは、

var foo = function() {
    console.log('ok');
};

foo関数の後半で宣言される変数です。だから、巻き上げのために、

var fails_ref = foo;

関数のどこかで が定義されていることは認識してfooいますが、その実際の値は認識していません。値の割り当てvar foo = function() {}は実行時に行われるためです。そのため、実際の割り当てステートメントが実行されるまでデフォルト値undefinedが使用されます。foo

于 2015-05-11T16:19:29.607 に答える