调用onload时,Window对象的某些变量会丢失

时间:2012-08-15 12:55:05

标签: javascript onload

simple fiddle显示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);

当调用此脚本directly with no wrap时,它会显示以下结果:

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]

但是called 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]

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

2 个答案:

答案 0 :(得分:2)

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

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

脚本可以访问在其当前范围内定义的变量/参数(objvariablesname

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

与场景一相同,只是范围更改为事件处理程序内的函数。因此,上述当地人不在范围内。

答案 1 :(得分: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);
}

objvariablesname现在是该函数的本地,而不是全局函数,因此不是window对象的属性。