2010-07-18 99 views
4

我对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!"); } 

是否有这三种方法之间的技术区别?

回答

2

有全局变量和窗口属性之间没有差异(至少不是那么多;))

最后范围中的每个函数的范围链是window对象。因此,window对象的每个属性都可以在任何函数中使用,而不明确引用window

更新:

我不明白为什么,VAR声明局部变量,下面不工作:

function imafunc() { 
    var imavar = "I'm a variable"; 
    window.alert(imafunc.imavar); 
} 

,你不能访问imafunc.imavar,因为它不是该函数的一个属性。 imavar激活对象的一个属性,它是在执行该函数时创建的,并且是作用域链中的“第一个作用域”。你不能直接访问它。

+0

这解释了为什么“窗口”是可选的,谢谢。 – theone 2010-07-18 08:53:57

+1

+1。八九不离十。比较准确地说,作用域链上的最后一个对象总是* global *对象;在浏览器中,'window'充当全局对象,但在其他环境中并非如此。 – 2010-07-18 13:06:57

+0

@Tim:谢谢你澄清。我知道*全球*的对象,但我不是100%肯定。 – 2010-07-18 13:11:57

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/

+0

感谢您对功能的澄清! 我与imavar混淆的是,“var imavar”会在函数外声明“window.imavar”,但“myfunc”中的“var imavar”不会声明“myfunc.imavar”。 – theone 2010-07-18 12:47:15

+1

这看起来不对。你的答案的第一部分看起来像是你在说一个函数内部,'this'是对函数对象本身的引用,通常情况并非如此。 – 2010-07-18 13:08:46

+0

Tim是对的,'imafunc.imavar'不会被定义。很多时候,'this'是指函数中的'window'对象(取决于“谁”称为函数)。 – 2010-07-18 13:13:19

3

关于你的观察:

我偶然发现这个使用GWT时;它似乎总是必须在那里显式引用窗口对象($ wnd),可能是因为它不是“真正的”窗口对象,而是某种类型的沙箱。

你总是需要在GWT JSNI中用$ wnd加上变量和函数前缀的原因是为了确保你从窗口范围(主机页面)访问变量。这是因为JSNI是在iframe中运行的,因此任何没有$ wnd限定符的变量都将在iframe范围内解析,而不是您想要的窗口范围。

相关问题