2012-07-18 11 views
5

बस गूगल के जावा स्क्रिप्ट कोड की जाँच और मैं इस वाक्य रचना मिल गया है:जावास्क्रिप्ट वाक्य रचना (0, fn) (args)

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

संभव डुप्लिकेट [जावास्क्रिप्ट अल्पविराम ऑपरेटर] (http://stackoverflow.com/questions/5580596/javascript-comma-operator) –

+0

बाहर curiousity की, आप में से अधिक पोस्ट कर सकते हैं यह कहां दिखाई देता है? – Austin

+0

मैं https://www.google.fr/xjs/_/js/s/sy46,zr/rt=j/ver=-wnZQEUYm8E.en_US./d=0/rs=AItRSTNMBUOhWluxPqsKFY9CVTnMlxNz6w – korko

उत्तर

0

अल्पविराम ऑपरेटर पिछले संकार्य का मान देता है, तो 0, myVar का मूल्य मान के समान है है myVar का। पहले ऑपरेंड का मूल्य मूल्यांकन किया जाता है, लेकिन इस मामले में यह निश्चित रूप से कुछ भी पूरा नहीं करता है।

अल्पविराम ऑपरेटर प्रयोग किया जाता है कभी कभी जब पहली संकार्य वास्तव में, कुछ करता है एक पाश में दो चर initialising की तरह:

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

हाँ मुझे पता है लेकिन वास्तव में कारण यह है कि इस (0, एफएन) का क्या हित है? अगर आप किसी को जानते हैं? हो सकता है कि यह विशिष्ट मामलों के लिए कुछ प्लेसहोल्डर है लेकिन मुझे नहीं लगता कि Google अपने जेएस में बेकार चार्ज जोड़ देगा। – korko

+1

@ कॉर्को: उस निर्माण के लिए कोई व्यावहारिक कारण नहीं है, इसलिए यह या तो गलतफहमी या कोड को खराब करने का प्रयास है। – Guffa

+0

मुझे नहीं लगता कि Google जावास्क्रिप्ट को गलत समझ रहा है: डी तो शायद obfuscate लेकिन मैं न तो नहीं सोचता, यह सिर्फ कुछ अक्षर जोड़ता है जबकि Google हमेशा फ़ाइल आकार को कम करने के लिए बेकार चार्ज हटाने की कोशिश कर रहा है। – korko

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 का मतलब कुछ भी नहीं है। क्या केवल कुछ प्रकार की सुरक्षा, उतरना या कुछ (0, एफएन)() के लिए अर्थ देने वाला कुछ है()। – korko

+0

क्षमा करें, लेकिन मैं किसी के बारे में नहीं सोच सकता। मुझे यकीन है कि एक कारण है हालांकि Google इसका उपयोग कर रहा है। – 0x499602D2

+0

वैसे भी, आपके उत्तर के लिए धन्यवाद, यह जानना अच्छी बात है;) – korko

1

मैं एक ही सवाल था और उसके बाद, इस सवाल का जवाब मिल गया इस प्रकार है::

यह वास्तव में

(0, foo.fn)(); 

के लिए याद रखें कि जावास्क्रिप्ट में, जब foo.fn() शुरू हो जाती है है यहाँ एक उदाहरण है , फिर fn के अंदर, thisfoo पर बाध्य है। आप

var g = foo.fn; 
g(); 

का उपयोग करते हैं तो जब g ऊपर उत्पन्न होता है, this वैश्विक वस्तु के लिए (window एक वेब ब्राउज़र के संदर्भ में,) बाध्य है।

तो क्या आपको ऊपर की तरह g परिभाषित करने की आवश्यकता है? क्या आप

(foo.fn)(); 

उत्तर कुछ नहीं कर सकते हैं। जावास्क्रिप्ट इसे foo.fn(); जैसा ही मानता है क्योंकि यह foo.fn अनावश्यक () के साथ हटाया जा सकता है।

लेकिन वहाँ एक तरीका है चारों ओर पाने के लिए है, और यह वास्तव में the comma operator, which Mozilla stated as

उपयोग करने के लिए अल्पविराम ऑपरेटर (बाएं से दाएं) ने अपने ऑपरेंड से प्रत्येक का मूल्यांकन करता है और पिछले संकार्य

का मान देता है

तो का उपयोग कर

(0, foo.fn)(); 

(0, foo.fn) समारोह, के लिए एक संदर्भ के लिए मूल्यांकन किया जाएगा lik ई g उपरोक्त, और फिर फ़ंक्शन का आह्वान किया जाता है। और फिर, thisfoo से बाध्य नहीं है लेकिन वैश्विक वस्तु के लिए बाध्य है।

तो इस तरह से लिखा कोड, "बाध्यकारी कटौती" है।

उदाहरण:

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 
की
संबंधित मुद्दे