2016-12-05 5 views
20

में का अर्थ है, यह इस तरह ध्वनि:क्या मैं किसी के कोड में इस कोड को पाया इस कोड (0, समारोह) जावास्क्रिप्ट

(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

सीधे आईआईएफई का उपयोग करने की बजाय लगता है, यह व्यक्ति खुद को स्मार्ट दिखाना चाहता था :) – 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

को समझता है ... आपने मुझे दावा करने के अन्य कारणों का एक गुच्छा दिया है कि जावास्क्रिप्ट डिज़ाइन टूटा हुआ है ... – Bakuriu

+0

अपना दूसरा उदाहरण करने के लिए एक बेहतर और अधिक पठनीय तरीका 'obj.method.call (विंडो)' होना चाहिए? – Whelkaholism

+1

@Whelkaholism यह 'obj.method होना चाहिए।कॉल (अपरिभाषित) 'यदि आप चाहते हैं कि यह सख्त मोड में बराबर हो। लेकिन इसके लिए फ़ंक्शन को 'फंक्शन.प्रोटोटाइप' से 'कॉल' का उत्तराधिकारी होना आवश्यक है। सभी कॉल करने योग्य ऑब्जेक्ट्स 'Function.prototype' से प्राप्त नहीं होते हैं, और यदि वे करते हैं, तो भी' कॉल' छाया हो सकती है। – Oriol

1

यह comma operatorself-executing anonymous function के साथ लपेटा गया है। हालांकि, मुझे इस बात का कोई अंदाजा नहीं है कि को obfuscation उद्देश्यों को छोड़कर अर्थहीन 0 क्यों शामिल किया गया था।

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) }()

संबंधित मुद्दे