2012-03-16 76 views
10

在調查谷歌Plusone精選劇本,我看到下面的語法很多次:使用這種語法的原因是什麼(0,_.Em)();

(0, _.Em)(); 

假設_.Em是一個功能上面的語句將導致調用該函數,這是很明顯的。另一方面,如果它不確定,那麼結果是否與簡單地使用_.Em()相同?

任何人都可以闡明使用這種語法背後的想法嗎?

+0

另請參閱[逗號運算符是否影響Javascript中的執行上下文?](http://stackoverflow.com/q/36076794/1048572) – Bergi 2016-09-16 12:29:33

回答

8

基本上,該語法允許在window對象的上下文中調用_.Em()而不是_

假設你有這樣的代碼:

Foo = function() { 
    this.foo = "foo"; 
}; 

Foo.prototype.Em = function() { 
    alert(this.foo); 
}; 

var _ = new Foo(); 

發行_.Em()將導致Em()被稱爲在_上下文。在函數內部,this關鍵字將引用_,因此foo將被打印。

發出(0, _.Em)()將來自對象的方法調用解耦並在全局上下文中執行調用。在函數內部,this關鍵字將引用window,因此undefined將被打印,因爲window不具有foo屬性。

您可以測試this fiddle中兩種語法之間的差異。

+0

但是爲什麼((0,_.EM)()那? – Niko 2012-03-16 10:46:05

+5

因爲計算'_.Em',所以應用調用操作符與直接調用'_.Em()'不一樣。評估'_.Em'獨立地返回一個「自由函數」,因爲沒有更好的術語,並且該函數不再與'_'對象綁定。同樣的結果可以通過寫'var f = _.Em; F();'。在這兩種情況下,'this'關鍵字將在函數內引用'window'而不是'_'。 – 2012-03-16 10:50:14

+0

+1,很好的答案。我想補充一點,這也許是我在JS中見過的最無意義的句法糖的形式。 '(0,)()'的長度與'.call()'的長度完全相同,所以沒有字節保存,除非你在逗號後刪除空格(甚至只有一個)。以混淆毫無戒心的開發者爲代價,使用這樣的語法似乎並不值得。 – 2012-03-16 10:50:51