2016-12-05 26 views
20

的意義,它聽起來像這樣:什麼是我發現這個代碼在別人的代碼,該代碼(0,功能)在javascript

(0, function (arg) { ... })(this) 

後,我嘗試玩像下面,

(0, function (arg) { console.log(arg) })(2); 
 
console.log((0, 1, 2, 3)); 
 
(0, function plus1 (arg) { console.log(arg + 1) }, function plus2 (arg) { console.log(arg + 2) })(5);

我發現,它總是會在支架返回最後一個項目。

我不知道這個編程模式的名稱是什麼,用例是什麼?

+33

這是[逗號操作符(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator),它是對混亂的人有用。 – Ryan

+0

是的,在這種情況下,我看不到這樣的實際原因......'0'實際上毫無價值 – qxz

+2

看起來像不是直接使用IIFE,這個人想讓自己看起來很聰明:) – Dummy

回答

21

在這種特殊情況下,它似乎是多餘的,但有時這種方法是有用的。

例如,eval

(function() { 
 
    (0,eval)("var foo = 123"); // indirect call to eval, creates global variable 
 
})(); 
 
console.log(foo);   // 123 
 
(function() { 
 
    eval("var bar = 123");  // direct call to eval, creates local variable 
 
})(); 
 
console.log(bar);   // ReferenceError

當你想調用一個方法,而沒有經過對象作爲this值也非常有用:

var obj = { 
 
    method: function() { return this; } 
 
}; 
 
console.log(obj.method() === obj);  // true 
 
console.log((0,obj.method)() === obj); // false

還要注意的是,根據上下文,它可能是參數分隔,而不是逗號操作:

console.log(
 
    function(a, b) { 
 
    return function() { return a; }; 
 
    } 
 
    (0, function (arg) { /* ... */ })(this) 
 
); // 0

+6

...你只是給了我一堆其他的理由,聲稱JavaScript設計被破壞... – Bakuriu

+0

Wouldn '更好更可讀的方式來做你的第二個例子'obj.method.call(window)'? – Whelkaholism

+1

@Whelkaholism它應該是'obj.method。調用(undefined)',如果你希望它在嚴格模式下也是等價的。但是這需要函數從'Function.prototype'繼承'call'。並不是所有的可調用對象都從'Function.prototype'繼承,即使他們這樣做了,'call'也可能被遮蔽。 – Oriol

2

典型的例子是,

for(var i=0,j=10; i < j; i++){ 
// code ... 
} 

comma operator將從左到右評估表達式並返回最右邊表達式的結果

// e.g. 
 

 
var a = 1, b= 2, c = 3, d = function(){ console.log("a => " + a) }()