2012-07-18 290 views
5

只是檢查谷歌的JavaScript代碼,我發現這句法:JavaScript語法(0,FN)(參數)

var myVar = function...; 
(0, myVar)(args); 

你知道這個語法是什麼意思? 我找不到和 (0, myVar)(args);myVar(args);之間的區別。

給出一個確切的例子,我們有

_.x3 = function (a, b) { 
    return new _.q3(20 * b.x + a.B.B.x, 20 * b.y + a.B.B.y) 
}; 

後來

this.ta = new _.s3((0, _.x3)(this.fa, this.B.B), 0); 
+0

可能重複的[JavaScript的逗號操作](http://stackoverflow.com/questions/5580596/javascript-comma-operator) – 2012-07-18 12:16:56

+0

出於好奇的,你能發佈更多的上下文出現在哪裏? – Austin 2012-07-18 12:18:43

+0

我在查看https://www.google.fr/xjs/_/js/s/sy46,zr/rt=j/ver=-wnZQEUYm8E.en_US./d=0/rs=AItRSTNMBUOhWluxPqsKFY9CVTnMlxNz6w – korko 2012-07-18 12:20:37

回答

0

逗號操作符返回最後一個操作數的值,所以0, myVar值是相同的值的myVar。評估第一個操作數的值,但在這種情況下,它當然不會完成任何操作。

逗號操作符是用來有時當第一個操作數實際上做的東西,就像在一個循環中初始化兩個變量:

for (i = 0, j = 42; i < 10; i++, j--) ... 
+0

是的,我知道,但其原因實際上是什麼(0,Fn)的利益?如果你知道嗎?也許這只是一些特定情況下的佔位符,但我不認爲谷歌會在他們的js中添加無用的字符。 – korko 2012-07-18 12:29:23

+1

@korko:這個構造沒有實際的理由,所以它不是誤解就是試圖混淆代碼。 – Guffa 2012-07-18 13:39:38

+0

我不認爲谷歌是誤解javascript:D所以也許混淆,但我不這麼認爲,它只是增加了一些字符,而Google總是試圖刪除無用的字符以減小文件大小。 – korko 2012-07-18 13:55:17

3

這句法使用逗號操作,,。它評估它的所有操作數並返回最後一個的值。在這種情況下,0僅用作佔位符,因此(0, function() {})將返回(function() {})。評估之後,(args)部分正在調用該函數併爲其提供參數。評論後

編輯:

之所以人們會使用編碼的這種風格,使他們能夠迅速地或在一行上執行代碼。這裏有一個例子:

var a = 0, 
    b = 1, 
    c; 

c = (a++, b++, a + 2); // a is added, b is added, and a is added then returned 

a; // 1 
b; // 2 
c; // 3 
+0

是的,絕對是一個很好的理由,但... 0沒有任何意義。是否有某種保護,descoping或給(0,fn)()而不僅僅是fn()的含義。 – korko 2012-07-18 12:36:47

+0

對不起,但我想不出任何。如果谷歌使用它,我相信有一個原因。 – 0x499602D2 2012-07-18 12:39:30

+0

無論如何,感謝您的回答,這是一件好事,知道;) – korko 2012-07-18 12:40:32

1

我有同樣的問題,然後找到了答案,如下:

這真的是

(0, foo.fn)(); 

請記住,在JavaScript中,當調用foo.fn() ,那麼在fn內,this綁定到foo。如果您使用

var g = foo.fn; 
g(); 

那麼當g上面調用時,this被綁定到全局對象(window,在Web瀏覽器的情況下)。

那麼你需要像上面那樣定義g?你能做些什麼,如

(foo.fn)(); 

答案是否定的。 JavaScript會將其視爲與foo.fn();相同,因爲它只是foo.fn,可以刪除多餘的()

但有得到解決是單向的,而正是利用the comma operator, which Mozilla stated as

逗號運算符它的每個操作數(從左至右),並返回最後一個操作數

的價值

因此,使用

(0, foo.fn)(); 

(0, foo.fn)將得到評估向功能,參考LIK e g,然後調用該函數。然後,this未綁定到foo,但綁定到全局對象。

所以用這種方式寫的代碼,就是「剪裁綁定」。

實施例:

var foo = { 
       fullName: "Peter", 
       sayName: function() { console.log("My name is", this.fullName); } 
      }; 

window.fullName = "Shiny"; 

foo.sayName();  // My name is Peter 

(foo.sayName)();  // My name is Peter 

(0, foo.sayName)(); // My name is Shiny