-2

リンクされた投稿に対する私のコメントへの返信を読んだ後、windowオブジェクトとグローバル スコープに関してテストすることにしました。thisthisthisなどの元の関数を参照する方法に関する他の質問をいくつか読みましたが、通常、それらはすべて、元の関数を別の変数に格納するか、匿名関数 (別の名前空間) にラップすることを伴います。

テストコード

var x = ' 0 '; // a global variable

document.body.innerHTML += x;
document.body.innerHTML += window.x;

// setTimeout before overriding
setTimeout(function () {
    document.body.innerHTML += ' 1 ';
}, 500);

// window.setTimeout before overriding
window.setTimeout(function() {
    document.body.innerHTML += ' 2 ';
}, 1000);

// Overriding setTimeout
function setTimeout(f, time) {
    'use strict';
    if (typeof f === 'function') {
        document.body.innerHTML += ' 3 ';
    }
}

// setTimeout after overriding
setTimeout(function () {
    document.body.innerHTML += ' 4 ';
}, 1000);

// window.setTimeout after overriding setTimeout globally
window.setTimeout(function () {
    document.body.innerHTML += ' 5 ';
}, 2000);

// Overriding window.setTimeout
window.setTimeout = function (f, time) {
    'use strict';
    if (typeof f === 'function') {
        document.body.style.backgroundColor = 'orange';
    }
};

// window.setTimeout after overriding
window.setTimeout(function () {
    document.body.innerHTML += ' 6 ';
}, 3000);

jsFiddleを参照してください。フィドルが初期化された後、[実行] をクリックして遅延を確認する必要がある場合があることに注意してください。

実験結果

0
undefined
3
3
(page becomes orange) 
2 (after a delay)
5 (after a longer delay)

期待される結果

0
0
3
(page becomes orange)
1 (after 500ms)
2 (after 1000ms)
5 (after 2000ms)

私のコードの動作が予想と異なる理由を誰か説明できますか?

また、ブラウザー環境の外で実行される JavaScript は異なることを認識しているため、この質問の目的のために、ブラウザー環境内の JavaScript のアプリケーションに固執します。

4

1 に答える 1

0

JSFiddle のコードは、グローバル スコープで実行されません。そのため、window.xundefined宣言して定義した後xです。

ローカルスコープの再定義について。あなたはこれを行うことができます:

var a;
a = b();
function b() {
    return 5;
}
console.log(a); // 5

b は先頭に移動されているため、宣言および定義される前に呼び出すことができます。これはホイストとも呼ばれます。

これを行っても:

function b () {
    return 1;
}
(function () {
    console.log(b()); // 2, not 1
    function b() {
        return 2;
    }
}());

繰り返しますが、巻き上げのためです。実際の実行順序は次のとおりです。

var b;
b = function () {
    return 1;
}
(function () {
    var b;
    b = function b() {
        return 2;
    }
    console.log(b()); // 2, makes sense
}());
于 2013-08-09T15:30:45.657 に答える