在javascript中,window和this.window有什么区别?

时间:2012-04-09 03:15:52

标签: javascript

我正在研究一些复杂的JavaScript,它正在对对象和脚本进行各种运行/动态操作。在这个过程中,我正在学习各种关于Javascript及其特性的细节。

但是,这个让我难过。是否存在

的情况
window !== this.window; //true

换句话说,你什么时候写这个窗口而不是直接窗外?

3 个答案:

答案 0 :(得分:4)

  

“是否存在window !== this.window; //true

的情况

当然,只要this引用没有.window属性或.window属性且没有指向全局对象的对象(假设浏览器环境在哪里) window是全球性的

  

“......你什么时候写this.window而不是直接window

this引用预期.window属性不是对全局的引用的对象时。

答案 1 :(得分:3)

this未在javascript中隐式搜索名称,就像在C ++和java中一样。

在javascript中,引用foo代替this.foosomeobject.foo,按顺序尝试任何var - 声明的变量,然后是全局命名空间。

this.var只查找this的成员(及其原型,原型的原型等)

在脚本的顶层,this引用默认的全局命名空间,即window对象,这是您在使用foo.meth()调用方法之前所处的位置。奇怪的是,window包含一个名为window的成员,它指向自己。所以你通常可以去:

window.window.window.window.location = "some_url"

如果你愿意,可以。事实上,你所假设的很多名称“就在那里”都是全局对象的成员,例如。

Object === window.Object

如果你愿意,你可以说

var window;

声明一个名为window的变量,该变量隐藏了该代码块中的全局窗口。但不要这样做。

我相信你实际上可以改变全局命名空间的内容,但我不记得如何。

答案 2 :(得分:1)

嗯,它是重复的,但当您处于全局范围(错误)时,this引用全局范围,而全局范围是window。 (所以this == windowwindow.window == window都是真的)

如果您在一个被用作构造函数的函数中,例如(new Pie()),this不再引用全局范围,而是引用创建的对象。 this实际上取决于您运行代码的位置。