我对JavaScript的窗口对象感到有点困惑。首先,请考虑以下两个声明:
var imglobal = "I'm Global";
window.imglobal = "I'm Global";
据我了解,这将完全相同(是吗?)在两种情况下都可以作为“imglobal”或“window.imglobal”访问。我不明白为什么,var声明本地变量,以下不起作用:
function imafunc() {
var imavar = "I'm a variable";
window.alert(imafunc.imavar);
}
那么为什么会这样呢?
var imavar = "I'm a variable";
window.alert(window.imavar);
我在使用GWT时遇到了这个问题;它似乎总是必须在那里明确地引用窗口对象($ wnd),可能是因为它不是“真正的”窗口对象而是某种沙盒。
它使函数更加混乱,我知道有三种方法来声明它们:
var myfunc = function() { window.alert("Hello, World!"); }
window.myfunc = function() { window.alert("Hello, World!"); }
function myfunc() { window.alert("Hello, World!"); }
这三种方法之间是否存在技术差异?
答案 0 :(得分:3)
关于你的观察:
我在使用GWT时遇到了这个问题;它似乎总是必须在那里明确地引用窗口对象($ wnd),可能是因为它不是“真正的”窗口对象而是某种沙盒。
您始终需要在GWT JSNI中使用$ wnd为变量和函数添加前缀的原因是确保从窗口范围(主机页面)访问变量。这是因为JSNI在iframe中运行,因此没有$ wnd限定符的任何变量都将在iframe的范围内解析,而不是你想要的窗口范围。
答案 1 :(得分:2)
全局变量和窗口属性之间没有区别(至少没有那么多;))
每个函数的作用域链中的最后一个作用域是window
对象。因此,window
对象的每个属性都可以在任何函数中使用,而无需显式引用window
。
<强>更新强>
我不明白为什么,var声明局部变量,以下不起作用:
function imafunc() { var imavar = "I'm a variable"; window.alert(imafunc.imavar); }
您无法访问imafunc.imavar
,因为它不是该功能的属性。 imavar
是激活对象的一个属性,它是在执行函数时创建的,并且是作用域链中的“第一个作用域”。您无法直接访问它。
答案 2 :(得分:1)
顺便说一下,为了使你的功能发挥作用,你必须使imavar成为函数的一个属性:
function imafunc() {
this.imavar = "I'm a variable";
window.alert(imafunc.imavar);
}
你的三个函数之间的不同之处在于,只有第三个函数可以在代码中声明之前调用,其他函数只有在分配给变量之后才可用,因为它们是无名函数表达式。
myfunc1() and myfunc2() //throws an error cause it isn't declared right now
myfunc3()//will alert(Hello, World!)
var myfunc1 = function() { window.alert("Hello, World!"); }
window.myfunc2 = function() { window.alert("Hello, World!"); }
function myfunc3() { window.alert("Hello, World!"); }
myfunc1()//will alert(Hello, World!)
myfunc2()//will alert(Hello, World!)
http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/