我正在研究一些复杂的JavaScript,它正在对对象和脚本进行各种运行/动态操作。在这个过程中,我正在学习各种关于Javascript及其特性的细节。
但是,这个让我难过。是否存在的情况window !== this.window; //true
换句话说,你什么时候写这个窗口而不是直接窗外?
答案 0 :(得分:4)
“是否存在
的情况window !== this.window; //true
”
当然,只要this
引用没有.window
属性或.window
属性且没有指向全局对象的对象(假设浏览器环境在哪里) window
是全球性的。
“......你什么时候写
this.window
而不是直接window
?
当this
引用预期.window
属性不是对全局的引用的对象时。
答案 1 :(得分:3)
this
未在javascript中隐式搜索名称,就像在C ++和java中一样。
在javascript中,引用foo
代替this.foo
或someobject.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 == window
和window.window == window
都是真的)
如果您在一个被用作构造函数的函数中,例如(new Pie()
),this
不再引用全局范围,而是引用创建的对象。 this
实际上取决于您运行代码的位置。