全局变量和窗口对象的属性有什么区别?

时间:2010-07-18 08:43:11

标签: javascript gwt

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

这三种方法之间是否存在技术差异?

3 个答案:

答案 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/