何时在JavaScript中使用self

时间:2010-07-22 13:48:51

标签: javascript

我注意到像setTimeout()这样的调用可以作为:

self.keyword()

或仅仅依靠自己,例如keyword()

这两个电话之间有什么不同?

3 个答案:

答案 0 :(得分:30)

self 可以引用窗口对象,但通常情况并非如此。您会在setTimeout()

之上看到这一点
var self = this;

他们保留对当前对象的引用,因此稍后当您调用self.keyword()时,您在该对象上调用该方法,而不是其他。

假设您在页面中有想要每2秒旋转一次的图像...您希望这3个计时器中的每一个都引用他们自己的方法。如果他们直接使用this,它(大部分时间)会引用window而不是当前对象,而传递另一个变量则维持当前引用。

答案 1 :(得分:12)

由于浏览器中存在两个条件,因此它适用于setTimeout

  • 所有全局变量都是window对象的属性。这意味着window有一个属性setTimeoutwindow.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”