我注意到像setTimeout()
这样的调用可以作为:
self.keyword()
或仅仅依靠自己,例如keyword()
。
这两个电话之间有什么不同?
答案 0 :(得分:30)
self
可以引用窗口对象,但通常情况并非如此。您会在setTimeout()
:
var self = this;
他们保留对当前对象的引用,因此稍后当您调用self.keyword()
时,您在该对象上调用该方法,而不是其他。
假设您在页面中有想要每2秒旋转一次的图像...您希望这3个计时器中的每一个都引用他们自己的方法。如果他们直接使用this
,它(大部分时间)会引用window
而不是当前对象,而传递另一个变量则维持当前引用。
答案 1 :(得分:12)
由于浏览器中存在两个条件,因此它适用于setTimeout
:
window
对象的属性。这意味着window
有一个属性setTimeout
(window.setTimeout
)。window
对象有一个名为self
的属性,指向自身。由于您可以在不明确写window
的情况下访问window
的属性(这是使全局变量成为全局变量的原因),因此两个调用都有效:setTimeout()
将查找属性{{ 1}}在窗口对象上。 setTimeout()
将在self.setTimeout()
对象上查找属性self
,该对象本身就是窗口对象。
因此,如果您致电window
,则self.setTimeout()
与window.self.setTimeout()
相同,与window.setTimeout()
相同,与setTimeout()
相同。
注意:仅当当前作用域中未定义的变量self
影响全局self
时才有效。
这适用于全局范围中定义的任何符号(表示变量或函数)。你可以自己测试一下:
alert(window.self);
和
alert(self);
应该提醒
[object Window]
答案 2 :(得分:6)
可以使用或不使用“window”来调用window
对象上的每个属性和方法。
和
self是窗口对象上的只读属性,它返回窗口本身(MDN)
所以
setTimeout()
window.setTimeout()
window.self.setTimeout()
self.setTimeout()
都是一样的。
执行self.setTimeout()
而不是window.setTimeout()
或其他任何方式的主要优点是,如果您在WebWorker中运行一些调用window.setTimeout()
的代码,它将失败,但{{1将在Web worker和浏览器上下文中工作。因此,如果您正在编写一个既可以在主窗口范围内工作又可以在Web工作者上工作的库,我们应该更喜欢使用self.setTimeout()
self.
总是引用GlobalScope,在浏览器模式为self
且Web工作者内部为“WorkerGlobalScope”