在調查谷歌Plusone精選劇本,我看到下面的語法很多次:使用這種語法的原因是什麼(0,_.Em)();
(0, _.Em)();
假設_.Em
是一個功能上面的語句將導致調用該函數,這是很明顯的。另一方面,如果它不確定,那麼結果是否與簡單地使用_.Em()
相同?
任何人都可以闡明使用這種語法背後的想法嗎?
在調查谷歌Plusone精選劇本,我看到下面的語法很多次:使用這種語法的原因是什麼(0,_.Em)();
(0, _.Em)();
假設_.Em
是一個功能上面的語句將導致調用該函數,這是很明顯的。另一方面,如果它不確定,那麼結果是否與簡單地使用_.Em()
相同?
任何人都可以闡明使用這種語法背後的想法嗎?
基本上,該語法允許在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,_.EM)()那? – Niko 2012-03-16 10:46:05
因爲計算'_.Em',所以應用調用操作符與直接調用'_.Em()'不一樣。評估'_.Em'獨立地返回一個「自由函數」,因爲沒有更好的術語,並且該函數不再與'_'對象綁定。同樣的結果可以通過寫'var f = _.Em; F();'。在這兩種情況下,'this'關鍵字將在函數內引用'window'而不是'_'。 – 2012-03-16 10:50:14
+1,很好的答案。我想補充一點,這也許是我在JS中見過的最無意義的句法糖的形式。 '(0,)()'的長度與'.call()'的長度完全相同,所以沒有字節保存,除非你在逗號後刪除空格(甚至只有一個)。以混淆毫無戒心的開發者爲代價,使用這樣的語法似乎並不值得。 – 2012-03-16 10:50:51
另請參閱[逗號運算符是否影響Javascript中的執行上下文?](http://stackoverflow.com/q/36076794/1048572) – Bergi 2016-09-16 12:29:33