2013-08-06 17 views
-1

我意外地偶然發現了下面的代碼,它實際上修改了全局命名空間: 雖然這不可能嗎?如何(意外)用coffeescript寫入全局上下文(命名空間)?

下面的代碼將三個變量到全局命名空間(try it):

this.my_global1=1 
@my_global2=2 
f= -> @my_global3=3 
f() 

如果你現在在cofeescript嘗試頁面與此替換上面的代碼

alert("#{[my_global1,my_global2,my_global3]}") 

,你會看到一個警報與

1,2,3 

這意味着上述聲明修改全球背景!

我花了好幾個小時才弄清楚我的代碼出了什麼問題,因爲我認爲coffeescript會保護我形成全球環境的意外變化!

+0

'this'是'window',所以代碼是做你告訴它做什麼。 – Blender

+0

的確如此,但代碼不清楚 –

+0

CoffeeScript無法知道每個範圍內的「this」是什麼。這超出了該語言的範圍。 – Blender

回答

2

CoffeeScript不能阻止你這樣做,但JavaScript可以。使用嚴格模式:

do -> 
    "use strict" 

    this.$ = 3 

在非嚴格模式下,如果未指定this默認爲window它當函數被調用。在嚴格模式下,this變得undefined,如果你嘗試性分配給它,這將引發錯誤:

TypeError: Cannot set property '$' of undefined 
+0

爲了說清楚:如果將其放在腳本的前面,則其餘代碼必須縮進。 –

+0

@Michael_Scharf:'do - >'只是一個自動執行的匿名函數('(function(){...})()')。你並不需要它。 – Blender

+0

@Blender首選的術語是IIFE(http://benalman.com/news/2010/11/immediately-invoked-function-expression/) –