3

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

不过,这让我很难过。有没有这样的情况

window !== this.window; //true

换句话说,你什么时候会写 this.window 而不是直接写出 window ?

4

3 回答 3

4

“有没有这样的情况window !== this.window; //true

当然,只要this指的是没有.window属性的对象或具有.window不指向全局对象的属性的对象(假设浏览器环境window是全局对象)

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

this指的是一个对象,其中一个.window属性预计不是对全局的引用。

于 2012-04-09T03:26:49.010 回答
3

this不会像在 C++ 和 java 中那样在 javascript 中隐式搜索名称。

在 javascript 中,引用某些东西foo而不是this.fooor someobject.foo,按顺序尝试任何var- 声明的变量,然后是全局命名空间。

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

在脚本的顶层,this指的是默认的全局命名空间,即window对象,在您使用foo.meth(). window奇怪的是,它包含一个名为windowwhich 指向自身的成员。所以你一般可以去:

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

如果你喜欢。实际上,您认为“就在那里”的很多名称都是全局对象的成员,例如

Object === window.Object

如果你喜欢你可以说

var window;

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

我相信您实际上也可以更改全局命名空间,但我不记得如何了。

于 2012-04-09T03:27:39.043 回答
1

好吧,它是重复的,但是this当您在全局范围(err)中时,它指的是全局范围,而全局范围是window. (所以this == windowwindow.window == window都是真的)

如果您在一个用作构造函数的函数中,例如 ( new Pie()),this则不再指代全局范围,而是指所创建的对象。真正取决于您this在哪里运行代码。

于 2012-04-09T03:26:06.703 回答