-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]

所以问题很明显:有人可以解释为什么是objvariables并且name第二小提琴结果中缺少变量吗?在这两种情况下,都obj指的是 Window 对象。

4

2 回答 2

2

执行代码的函数范围发生了变化。

场景一 (在全局范围内调用脚本)

脚本可以访问在其当前范围 ( obj,variablesname您的情况下定义的变量/参数。

场景二 (脚本从 onload 事件的处理程序执行)

除了范围更改为事件处理程序内的函数外,与场景一中的情况相同。因此,上述本地人不在范围内。

于 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 回答