2013-10-06 99 views
0

我怎麼能寫出下面的JavaScript到CoffeeScript的無法獲得正確表達


foo.bar(function() { 
    doSomething(); 
})(x, y); 

例如,下面不工作:


foo.bar -> 
    doSomething() 
(x, y) 

回答

1

事情是這樣的:

f -> 
    ... 
(x, y) 

在CoffeeScript中有點模糊的,因爲(x, y)是對自己有效的表達。由於形式f(g(x))f(g)的東西比f(g)(x)多見,模糊解析爲兩個語句:

f -> ... 

(x, y) 

當解析器解析歧義,你做不成方式想要的解決辦法是通過用括號強制你想要的解釋來解決模糊性:

foo.bar(-> 
    doSomething() 
)(x, y) 

變成this JavaScript

foo.bar(function() { 
    return doSomething(); 
})(x, y); 

,可能會或可能不會有作爲的JavaScript你想達到同樣的效果。如果foo.bar關心它的參數的返回值,然後

return doSomething(); 

,只是

doSomething(); 

可以是完全不同的;在CoffeeScript中隱含的「返回最後一個表達式的值」可能會讓你感覺不舒服。一個例子是jQuery's each,如果迭代器函數正好返回false,將停止迭代,但如果迭代器根本不返回任何內容(即undefined),將繼續。如果您的行爲foo.bar這種方式,那麼你可能需要明確指出foo.bar的說法不返回任何內容:

foo.bar(-> 
    doSomething() 
    return 
)(x, y) 

這將成爲this JavaScript

foo.bar(function() { 
    doSomething(); 
})(x, y); 

,這就是你到底是什麼尋找。

你也可以使用一個命名函數來代替匿名之一:

pancakes = -> 
    doSomething() 
foo.bar(pancakes)(x, y) 

你仍然有可能return問題上面提到的(和你解決它以同樣的方式),但也許這種結構會更容易你閱讀和使用;如果匿名函數的長度超過5-10行,我會經常以這種方式重構事情,因爲它使結構更容易讓我眼球。

0

呀,CoffeeScript中不允許一切JS能,因爲我們的含意。 只需使用括號,明確;)。