0

我的理解是,在咖啡脚本函数内部,“this”或“@”等于“window”(至少在 Rails 的上下文中)。为什么我可以让这段代码工作:

window.googletag = window.googletag or {}
window.googletag.cmd = window.googletag.cmd or []

window.googletag.cmd.push ->
  window.googletag.defineSlot('/1003175/ad-name-here', [336, 280], 'div-gpt-ad-1349373630997-0').addService(window.googletag.pubads())
  window.googletag.pubads().enableSingleRequest()
  window.googletag.enableServices()

但不是这段代码

@googletag = @googletag or {}
@googletag.cmd = @googletag.cmd or []

@googletag.cmd.push ->
  @googletag.defineSlot('/1003175/ad-name-here', [336, 280], 'div-gpt-ad-1349373630997-0').addService(@googletag.pubads())
  @googletag.pubads().enableSingleRequest()
  @googletag.enableServices()

当我放入我的代码警报(@ == window)时,我得到了真实的..如果它们是相同的,那么为什么一个工作而不是另一个工作?难道没有更优雅的方式来编写这段代码,然后将 window 附加到单词 googletag 的每个实例?

4

1 回答 1

2

在 coffeescript 中,@等价于this,但 的值this取决于您在代码中的当前范围。在您的示例中,alert(@ == window)返回 true 因为在该上下文 this中是窗口。但是当您在另一个上下文中使用它时,例如在函数定义 ( @googletag.cmd.push -> ...) 中,它将获得调用该函数的任何范围的上下文。

最后,这不是咖啡脚本问题,而是 Javascript 问题。我建议阅读更多关于this的内容,起初这是一个有点令人困惑的概念。

这是一篇帮助我更好地理解这个概念的文章:http: //yehudakatz.com/2011/08/11/understanding-javascript-function-invocation-and-this/

于 2012-10-04T23:41:36.290 回答