2012-01-08 11 views
62

में मैं जानता हूँ कि यह मूर्खतापूर्ण है, लेकिन इस बीच कोई अंतर है:(...()) बनाम (...)() javascript बंद

(function() { 
    var foo = 'bar'; 
})(); 

और इस?

(function() { 
    var foo = 'bar'; 
}()); 

JSLintMove the invocation into the parens that contain the function लिए हमें बताता है, लेकिन मैं करने की कोई जरूरत को देखते हैं।

संपादित करें: उत्तर बहुत अच्छे हैं। ~function, JSHint वैकल्पिक रूप से (/***/)(); और क्रॉकफोर्ड के स्पष्टीकरण के लिए jQuery की प्राथमिकता के साथ वैकल्पिक! मैंने सोचा कि मैं सिर्फ "वे एक ही चीज़" उत्तर देने के लिए जा रहा था।
आप लोग अपवॉट्स के माध्यम से सबसे अच्छा फैसला करते हैं और मैं इसे टिक करता हूं।

+1

ये दो उदाहरण बहुत ही समान हैं लेकिन 'कुत्ते की गेंद' संस्करण ब्रांड्स के पहले सेट के बाहर परिणाम देता है जबकि क्रॉकफ़ोर्ड अनुमोदित संस्करण इसे अंदर देता है। यह शायद ही कभी महत्वपूर्ण है लेकिन यह एक अंतर है। – Okonomiyaki3000

+0

@ Okonomiyaki3000 यह कोई फर्क नहीं पड़ता है, जब तक कि आप इसे हस्ताक्षर नहीं करते हैं (यानी, कोष्ठक के अंदर और अधिक चीज़ें जोड़ना)। वास्तव में, मुझे लगता है कि 'foo = (/ *** /)();' और 'foo = (/ *** /());' एक ही बाइटकोड को संकलित कर सकता है। इस बात पर विचार करें कि '(ए + बी) + (सी + डी)' 'ए + (बी + सी) + डी' के समान संकलित होगा। –

+0

हां, 'foo = (/ *** /)(); 'और' foo = (/ *** /());' वही हैं लेकिन '(foo =/*** /)();' और '(foo =/*** /)();' नहीं हैं। और, हाँ, यह pedantic है। ऐसा करने के लिए शायद कभी भी एक अच्छा कारण नहीं है। – Okonomiyaki3000

उत्तर

48

कोई फर्क नहीं पड़ता। घोषणा के बजाय अभिव्यक्ति के रूप में अपने फ़ंक्शन का इलाज करने के लिए जावास्क्रिप्ट पार्सर को वैध तरीके से दोनों ही वैध तरीके हैं।

ध्यान दें कि + और ! भी काम करेंगे, और कभी कभी आकार का एक चरित्र को बचाने के लिए minifiers द्वारा किया जाता है: पूर्णता के लिए, @copy बताते हैं के रूप में

+function() { 
    var foo = 'bar'; 
}(); 

!function() { 
    var foo = 'bar'; 
}(); 

संपादित

, ~ और - भी काम करेगा।

-function() { 
    var foo = 'bar'; 
}(); 

~function() { 
    var foo = 'bar'; 
}(); 
+0

+1, मैं उसे कभी नहीं जानता था। – Ryan

+14

पूर्णता के लिए, '~' और '-' यह भी करेगा (सभी यूनरी ऑपरेटरों)। निश्चित रूप से '~' सबसे अच्छा तरीका है। – copy

+3

वाह, उस गुप्त वाक्यविन्यास के लिए +1! अगर उन्हें उत्पादन में दिखाई देता है तो कुछ अवांछित कोडर अपने सिर खरोंच कर सकते हैं। क्या यह क्रॉस-ब्राउजर काम करता है? क्या यह कल्पना में है? मैं समझ नहीं पा रहा हूं कि यह क्यों काम करता है। –

10

नहीं, मुझे विश्वास नहीं है कि कोई अंतर है। मैं व्यक्तिगत रूप से पूर्व पसंद करता हूं (और jQuery एट अल। सहमत हैं) लेकिन वे दोनों परीक्षण किए गए प्रत्येक इंजन में समान रूप से काम करते हैं।

इसके अलावा, जेएसलिंट कभी-कभी थोड़ा सख्त होता है। JSHint उस संबंध में थोड़ा बेहतर हो सकता है।

+2

मैं पूर्व को भी पसंद करता हूं। –

+0

ओह, JSHint के बारे में नहीं पता था। हां, जेएसलिंट के साथ परीक्षण करते समय केवल कोड लिखा गया है, मैं कभी जांचने से पहले त्रुटियों से बचने में सक्षम नहीं हूं। –

38

JSLint उल्लंघन मौजूद है ऐसा इसलिए है क्योंकि डगलस Crockford कहते हैं बाहर-कोष्ठकों संस्करण "कुत्ते गेंदों" की तरह लग रहा है।

आप सुन सकते हैं उसे this video में इस पर चर्चा:

I think that looks goofy, 'cause what we're talking about is the whole invocation, but we got these things hanging outside of it looking sorta like ... dog balls.

उनका सुझाव है कि मदद के अंदर कोष्ठकों पाठक कि पूरे बयान एक समारोह अभिव्यक्ति बजाय एक घोषणा है समझते हैं।

+2

+1 - तो क्रॉकफ़ोर्ड जैसा दिखता है :) –

+18

मुझे जेएसलिंट में 'डगलस क्रॉकफ़ोर्ड की वरीयताओं' चेकबॉक्स को अनदेखा करना होगा। –

+0

वह उस वीडियो में कई जेएसलिंट नियमों को औचित्य देता है, और उनमें से कई सभ्य कारण हैं। लेकिन उनमें से कुछ भी सुंदर नाइट-पिक्य हैं। –

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