-1

この単純なフィドルは、Window オブジェクトのプロパティを示しています。

var obj = this; // object Window
var variables = "";
for (var name in obj) {
    if (obj.hasOwnProperty(name)) {
        variables += name + " : " + obj[name] + "<br/>";
    }
}
document.writeln(variables);

このスクリプトがラップなしで直接呼び出されると、次の結果が表示されます。

window : [object Window]
document : [object HTMLDocument]
InstallTrigger : [object Object]
obj : [object Window]
variables : window : [object Window]  document : [object HTMLDocument]  InstallTrigger : [object Object] obj : [object Window]
name : name
getInterface : function getInterface() { [native code] }
location : http://fiddle.jshell.net/_display/
navigator : [object Navigator]

しかし、onload を呼び出すと、以下のみが表示されます。

window : [object Window]
document : [object HTMLDocument]
InstallTrigger : [object Object]
getInterface : function getInterface() { [native code] }
location : http://fiddle.jshell.net/4x3Tx/2/show/
navigator : [object Navigator]

そして、質問は明らかです: 誰かが理由を説明できobjますか? どちらの場合も、は Window オブジェクトを参照します。variablesnameobj

4

2 に答える 2

2

コードが実行される関数スコープが変更されます。

シナリオ 1 (グローバル スコープで呼び出されるスクリプト) :

スクリプトは、現在のスコープで定義されている変数/引数にアクセスできます ( objvariablesおよびnameあなたの場合は .

シナリオ 2 (スクリプトは onload イベントのハンドラーから実行されます) :

スコープがイベント ハンドラー内の関数に変更されることを除いて、シナリオ 1 と同じです。したがって、前述のローカルは対象外です。

于 2012-08-15T12:58:40.440 に答える
1

コード「onLoad」を実行すると、関数内に配置され、次のように割り当てられwindow.onloadます。

window.onload=function(){
    var obj = this;
    var variables = "";
    for (var name in obj) {
        if (obj.hasOwnProperty(name)) {
            variables += name + " : " + obj[name] + "<br/>";
        }
    }
    document.writeln(variables);
    console.log(obj);
}

objvariablesおよびname現在はその関数に対してローカルであり、グローバルではないため、windowオブジェクトのプロパティではありません。

于 2012-08-15T13:00:39.403 に答える