此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]
所以问题很明显:有人可以解释为什么第二小提琴结果中缺少obj
,variables
和name
个变量?在这两种情况下,obj
都指向Window对象。
答案 0 :(得分:2)
执行代码的函数范围会发生变化。
场景一 (全局范围内调用的脚本):
脚本可以访问在其当前范围内定义的变量/参数(obj
,variables
和name
。
场景二 (脚本从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);
}
obj
,variables
和name
现在是该函数的本地,而不是全局函数,因此不是window
对象的属性。