2011-06-28 89 views
3

有時我們需要通過名稱調用函數。我可以在普通的JavaScript做如下:通過名稱調用函數

​​

預期和add()被調用其中一期工程。

等價的CoffeeScript代碼可能會寫成如下。

[email protected] 
add=(a,b)->a+b 
global['add'](1,2) 

其編譯成JavaScript作爲:

(function() { 
    var add, global; 
    global = this; 
    add = function(a, b) { 
    return a + b; 
    }; 
    global['add'](1, 2); 
}).call(this); 

...它不工作。

Microsoft JScript runtime error: Object doesn't support this property or method 

是否有解決此問題的簡單方法?

注:

  1. 我沒有運行在瀏覽器的代碼,因此不存在窗口對象。但在普通的JS中,我始終可以通過指定global=this來捕獲全局範圍,然後從中獲取函數指針。

  2. 我發現CoffeeScript中的一個解決方案是將所有函數聲明爲像global.add=[function definition]這樣的全局對象的成員。但是,我必須通常將該函數調用爲global.add()。而且它比需要的更多的是鍋爐板。

有沒有簡單的黑客?或者更簡單的解決方案?

回答

8

您的add是一個局部變量。使用

@add=(a,b)->a+b 

將其附加到global對象。由於global是腳本的全球範圍,因此您仍然可以撥打add,而無需在global.前加前綴。

+0

這個答案是正確的。當您在CoffeeScript中編寫'x = y'時,您總是在同一個文件中創建'var x'聲明或引用現有的'var x'聲明。在JS世界中,忽略'var'來創建全局變量被廣泛認爲是不好的做法; CoffeeScript強制執行這個約定。 –

0

默認情況下,CoffeeScript編譯器封裝閉包作用域中的每個文件,但是可以通過將--bare開關添加爲編譯器選項來禁用此行爲。

add.coffee:

add = (a,b) -> a+b 

當你運行:coffee --compile add.coffee

這將產生:

(function() { 
    var add; 
    add = function(a,b) { 
    return a+b; 
    }; 
}).call(this); 

現在嘗試與--bare開關 coffee --bare --compile add.coffee

運行

這將產生:

var add; 
add = function(a, b) { 
    return a + b; 
}; 

現在你的文件沒有關閉作用域,你可以像你之前那樣做。