高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

CoffeeScript 裡的全域變數

在CoffeeScript裡,即使是一個空的.coffee檔,它也會被編譯成這樣:

1
2
3
(function() {

}).call(this);

你在.coffee寫的任何變數或function,都是被宣告為區域變數包在裡面,只會在裡面有作用而已。這其實是好事,因為這樣一來與外界隔離,你寫的東西不會去污染到別人寫的,相對的別人寫的東西也不會去弄髒你寫的。但假設因為某些不可抗力,硬是要把變數或function弄成global好讓所有頁面都可以直接使用,也不是沒辦法,你可以直接把變數或function掛在window物件底下:

1
2
window.logout = ->
  alert "You've already logout!" if confirm "Are you sure to logout?"

或是這樣做:

1
2
3
root = exports ? this
root.logout = ->
  alert "You've already logout!" if confirm "Are you sure to logout?"

第二種寫法看起來比較麻煩,但比較通用。exports是在Node.js裡定義的物件,上面第1行的意思是指會先檢查exports是不是已經有定義了,如果這段程式是在Node.js裡執行的話,因為exports是存在的,所以會定義一個root變數並指向它;如果是在一般的網頁上執行,因為沒有exports,所以會定義一個root指向this,也就是window物件 ,所以這樣的寫法的好處就是在網頁或是Node.js都行得通。

這樣一來,你在頁面上的按鈕就可以這樣寫:

1
<input type="button" value="logout" id="Logout" onclick="logout();" />

但是,如果可以的話,建議還是儘量避免用這種global變數的方式來寫程式,現在的JavaScript越寫越複雜,沒人知道你寫的東西會不會剛好就去衝到誰家寫的library,或是衝到你自己或同事寫的程式碼 :)

Comments