2009-12-08 13 views
27

क्या कुछ प्रकार की फ़ंक्शन घोषणा के नीचे दिए गए जावास्क्रिप्ट कोड स्निपेट हैं? अगर कोई ऐसा नहीं कर सकता है तो वे क्या हैं?जावास्क्रिप्ट फ़ंक्शन घोषणा

some_func = function(value) { 
    // some code here 
} 

और यह ऐसा करने का

show:function(value){ 
    // some code here 
} 

उत्तर

25

पहले एक बस एक गुमनाम समारोह बनाने और एक चर करने के लिए यह बताए है some_func। इसलिए some_func() का उपयोग करके फ़ंक्शन को कॉल किया जाएगा।

दूसरा एक

var obj = { 
    show:function(value){ 
    // some code here 
    } 
}; 

तो एक वस्तु संकेतन का हिस्सा होना चाहिए, obj.show() फ़ंक्शन

दोनों ही मामलों में फोन करेंगे, तो आप एक गुमनाम समारोह बना रहे हैं।लेकिन पहले मामले में, आप बस इसे एक चर के लिए असाइन कर रहे हैं। जबकि दूसरे मामले में आप इसे किसी ऑब्जेक्ट के सदस्य के रूप में असाइन कर रहे हैं (संभवतः कई अन्य लोगों के बीच)।

+0

'ओब्जे' पर बाहरी संश्लेषण अनावश्यक –

+1

ओह है! मॉड्यूल पैटर्न का उपयोग करके कोड लिखने के बारे में SO में मेरी एक पोस्ट का जवाब ने कहा कि उन कंस्ट्रैसिस के बिना, कभी-कभी अज्ञात फ़ंक्शन विफल हो सकते हैं। मुझे अभी भी एक स्पष्टीकरण क्यों नहीं मिला। सुनिश्चित नहीं है कि वे केवल मॉड्यूल पैटर्न या सभी अज्ञात कार्यों पर लागू होते हैं या नहीं। यही कारण है कि मैंने उन्हें जोड़ा। –

+0

मुझे लगता है कि जब आप 'eval ("({a: 1})" जैसे किसी ऑब्जेक्ट को eval करते हैं तो " – YOU

2

एक ही रास्ता:

var some_func = function(value) { 
    // some code here 
} 

एक और तरीका है:

function some_funct() { 
} 

फिर भी एक और तरीका है:

var some_object={}; 
some_object["some_func"] = function() {}; 

या:

var some_object={}; 
some_object.some_func = function() {}; 

दूसरे शब्दों में, वे जे एस में एक समारोह की घोषणा करने के कई तरीके हैं।


आपका दूसरे उदाहरण सही नहीं है।

+0

'some_object [" some_func "] = function() {}; 'बोझिल है। डॉट नोटेशन का उपयोग क्लीनर है: 'some_object.some_func = function() {}; ' –

+0

@ जस्टिन: ... और अभी तक एक फ़ंक्शन घोषित करने का एक और तरीका है! – jldupont

+0

घोषणा एक ही है (आरएचएस), यह केवल एक्सेस नोटेशन है जो अलग है (एलएचएस);) –

1

पहला एक चर के लिए आवंटित एक फ़ंक्शन घोषणा है (कम से कम यह होना चाहिए कि इस तथ्य के बावजूद कि यह पहले वैरिएबल प्रकार की घोषणा गायब है), दूसरा एक ऑब्जेक्ट घोषणा से संबंधित है।

+0

दूसरा रूप कभी कभी वस्तु शाब्दिक में प्रयोग किया जाता है: 'some_obj = { init: समारोह() {}, शो: समारोह() {} };' – MBO

+0

पोस्ट को अद्यतन, @ सेंथिल के जवाब सही भी है। – yoda

4

पहले सौंपा गुमनाम समारोह के साथ स्थानीय (या वैश्विक) चर रहा है।

var some_name = function(val) {}; 
some_name(42); 

दूसरा सौंपा गुमनाम समारोह के साथ कुछ ऑब्जेक्ट (या इसे के सामने लेबल के साथ समारोह) की संपत्ति है।

var obj = { 
    show: function(val) {}, 
    // ... 
}; 
obj.show(42); 

कार्य जावास्क्रिप्ट में प्रथम श्रेणी के नागरिक हैं, तो आप चर करने के लिए उन्हें आवंटित और चर से उन कार्यों कह सकते हैं।

आप वैरिएबल की तुलना में अन्य नाम के साथ फ़ंक्शन घोषित भी कर सकते हैं, जो कि फ़ंक्शन को असाइन किया जाएगा। यह उपयोगी है जब आप पुनरावर्ती तरीकों को परिभाषित करना चाहते हैं, तब इस के उदाहरण के लिए:

var obj = { 
    show: function(val) { 
     if (val > 0) { this.show(val-1); } 
     print(val); 
    } 
}; 

आप लिख सकते हैं:

var obj = { 
    show: function f(val) { 
     if (val > 0) { f(val-1); } 
     print(val); 
    } 
}; 
1

पहला उदाहरण वैश्विक चर बनाता है (यदि उस नाम का स्थानीय चर पहले से मौजूद नहीं है) some_func कहा जाता है, और इसे एक फ़ंक्शन असाइन करता है, ताकि some_func() लागू किया जा सके।

दूसरे उदाहरण एक वस्तु के अंदर एक समारोह घोषणा है। यह एक वस्तु की show संपत्ति के मूल्य के रूप में एक समारोह प्रदान करती है:

var myObj = { 
    propString: "abc", 
    propFunction: function() { alert('test'); } 
}; 

myObj.propFunction(); 
+0

आपका JSON नोटेशन गलत है। –

+0

डी ओह। ध्यान देने के लिए धन्यवाद। यदि * वह * जो मैं लिखना चाहता था, तो मैं वास्तविक प्रश्न को संबोधित नहीं करता: डी –

0

पहले एक ...

some_func = function(value) { 
    // some code here 
} 

एक चर घोषित करने और असाइन किया गया है इसे करने के लिए एक anonymous function है, जो के बराबर है ...

function some_func (value) { 
    // some code here 
} 

दूसरा एक इस तरह दिखना चाहिए ...

obj = { 
    show:function(value){ 
     // some code here 
    } 
} 
// obj.show(value) 

और के बराबर ...

//pseudo code 
class MyClass { 
    function show (value) { 
     // some code here 
    } 
} 
obj = new MyClass(); // obj.show(value) 

चीयर्स

+0

आपके पिछले दो उदाहरण बराबर नहीं हैं क्योंकि आप ऑब्जेक्ट अक्षर को तत्काल नहीं कर सकते हैं (त्रुटि: "टाइपर: ओबीजे एक कन्स्ट्रक्टर नहीं है")। 'var Obj = function() {this.show = function() {}; } 'आपके छद्म कोड के बराबर है। –

+0

@ जस्टिन जॉनसन - ओह! वास्तव में? फिर, यह पूरी तरह से क्यों काम करता है? 'obj = {show: function (value) {चेतावनी (" काम ");}} obj.show();' –

+0

हां वास्तव में। मैंने यह नहीं कहा कि 'obj.show()' काम नहीं करता है, मैंने कहा कि आपके उदाहरण बराबर नहीं हैं। –

72

वहाँ छह तरीके/संदर्भों जिसमें कार्यों बनाने के लिए कर रहे हैं:

1) स्टैंडर्ड कथात्मक संकेतन (के लिए सबसे परिचित सी पृष्ठभूमि वाले लोग)

function foo() {} 

2) (एक वस्तु शाब्दिक

var obj = { 
    foo: function() {} 
}; 

3) एक instantiated वस्तु की एक विधि के रूप में करने की एक विधि हर बार new exectued है)

बनाया के रूप में:सभी बाकी समारोह भाव हैं
var Obj = function() { 
    this.foo = function() {}; 
}; 

4) एक प्रोटोटाइप की एक विधि के रूप में (चाहे कितनी बार new निष्पादित किया जाता है की केवल एक बार बनाया,)

+०१२३५१६४१०६१
var Obj = function() {}; 
Obj.prototype.foo = function() {}; 

5) एक संदर्भ (एक ही प्रभाव # 1 के रूप) *

var foo = function() {}; 

6) के रूप में एक तुरंत मार डाला गुमनाम समारोह (पूरी तरह से गुमनाम) के साथ एक गुमनाम समारोह के रूप में

(function() {})(); 

* जब मैं इस कथन को देखता हूं, मैं परिणाम मानता हूं। इस प्रकार, मैं वास्तव में इन्हें अनाम के रूप में नहीं मानता, क्योंकि फ़ंक्शन को तुरंत संदर्भ दिया जाता है और इसलिए अब अज्ञात नहीं है। लेकिन यह ज्यादातर लोगों के लिए समान है।

+0

क्या # 1 या # 5 पसंद करने का कोई कारण है? मैं बहुत सारी मुक्ति में # 5 देखता हूं, और कभी-कभी # 1। – EsTeGe

+6

कोई बात नहीं, मुझे यहां जवाब मिला: http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/ – EsTeGe

+0

यह शानदार है। +1। –

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