0

私の理解では、coffeescript関数の内部では、「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()

コードアラート(@ ==ウィンドウ)に配置すると、trueになります。それらが同じである場合、なぜ一方は機能し、もう一方は機能しないのでしょうか。このコードを記述してから、googletagという単語のすべてのインスタンスにウィンドウを追加するより優雅な方法はありませんか?

4

1 に答える 1

2

coffeescript では、@は と同等ですthisが、 の値はthisコード内の現在のスコープに依存します。あなたの例では、そのコンテキストではウィンドウでalert(@ == window)あるため、trueを返します。ただし、関数定義 ( ) 内など、別のコンテキストで使用すると、その関数が呼び出されたスコープのコンテキストが取得されます。 this@googletag.cmd.push -> ...

結局のところ、これはコーヒースクリプトの問題ではなく、Javascriptの問題です。についてもう少し読むことをお勧めしthisます。最初はやや混乱する概念です。

概念をよりよく理解するのに役立つ記事の 1 つを次に示します

于 2012-10-04T23:41:36.290 に答える