2015-01-02 13 views
5

मैं एक जावास्क्रिप्ट वस्तु कोड नीचे के रूप में बनाने के लिए:जावास्क्रिप्ट: स्ट्रिंग के रूप में बाहर कोष्ठक वापसी के पूरे समारोह के साथ एक समारोह बुला

var obj={ 
    a : 10, 
    b : 20, 
    add : function(){ 
    return this.a + this.b; 
    }, 
}; 

मैं इस कोड obj.add साथ समारोह निष्पादित और इसे इस तरह स्ट्रिंग के रूप में पूरे समारोह वापसी : -

function(){ 
    return this.a + this.b; 

लेकिन बाद में मैं कोशिश करके फिर से obj.add() तरह कोष्ठक सहित फ़ंक्शन को कॉल करें और यह मूल्य 30. यहाँ मैं समझ नहीं सकता मैं क्यों मिल लौट ऐसे बाहर विभिन्न 012 के साथ समारोह बुला पर डालऔर obj.add()? एक ऑब्जेक्ट को कॉल करने के बीच मुख्य अंतर क्या है जो ब्रांड्स के साथ काम करता है और बाहर ब्रांड्स के साथ क्या कोई शरीर मदद कर सकता है ??

+2

आप कर सकते हैं नहीं * कॉल * कोष्टक के बिना एक समारोह। '()' जोड़ना यह है कि आप फ़ंक्शन को कैसे कॉल करते हैं। '()' के बिना, आप केवल कार्य ही प्राप्त कर रहे हैं। जावास्क्रिप्ट में, फ़ंक्शंस केवल चर होते हैं, जैसे स्ट्रिंग्स या इनट्स या जो भी हो। –

+0

'एड' [एक 'फंक्शन' ऑब्जेक्ट] है (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)। जब आप इसे बिना किसी कंस्ट्रैसिस के उपयोग करते हैं, तो आप * सबसे अधिक संभावना * कॉलर के [टाइप जबरन] के माध्यम से इसे 'स्ट्रिंग' में परिवर्तित कर सकते हैं (http://stackoverflow.com/questions/19915688/what-exactly-is-type- coercion-in-javascript) – blgt

+0

लेकिन जैसा कि मैं dev उपकरण में देखता हूं, मैं obj.add को कॉल करके मुझे ऑब्जेक्ट नहीं मिल रहा है, लेकिन कट्टरपंथी स्ट्रिंग। मुझे यह – ambes

उत्तर

5

बिना कोष्ठक, आप समारोह के लिए एक संदर्भ को पुन: प्राप्त कर रहे हैं, आपको बुला रहा नहीं कर रहे हैं (क्रियान्वित) समारोह

कोष्ठकों के साथ

, आप फ़ंक्शन को निष्पादित कर रहे हैं।

function a() { 
 
    return 2; 
 
} 
 

 
var b = a(); // called a, b is now 2; 
 
var c = a; // c is referencing the same function as a 
 
console.log(c); // console will display the text of the function in some browsers 
 
var d = c(); // But it is indeed a function, you can call c(), d is now 2;

+0

' सी मिलना चाहिए जैसा कि अभी सत्य नहीं है, यह मान द्वारा पारित किया गया है, संदर्भ नहीं। 'C' बदलना 'ए' नहीं बदलेगा, न ही इसके विपरीत। – Shomz

+0

@Shomz OK, 'c' अब एक ही कार्य ऑब्जेक्ट को 'ए' के ​​रूप में संदर्भित करता है। –

3

आप obj.add साथ समारोह निष्पादित नहीं होता तो आप केवल इसे वस्तु और पर्यावरण आप एक स्ट्रिंग के रूप समारोह प्रस्तुत करने के लिए हुआ में हैं में देखा। आप कोष्ठक जोड़कर इसे निष्पादित करते हैं।

2

ब्रांड्स के बिना आप वास्तव में कुछ भी नहीं बुला रहे हैं, न ही आप कुछ भी लौट रहे हैं, यह सिर्फ एक संदर्भ है!

मैं आप इस

var result = ambes.add; 

console.log(result); 

की तरह कुछ किया था अनुमान लगा रहा हूँ और उस समारोह फोन नहीं है, यह add संपत्ति, जो है समारोह की वास्तविक सामग्री लॉग करता है, और प्रवेश फ़ंक्शन फ़ंक्शन की स्ट्रिंग सामग्री को लॉग करेगा, न कि वह इसे वापस करने के लिए क्या करेगा। है, जबकि functionName() समारोह निष्पादित करता है और अपनी वापसी मान देता है (या, हो, तो कोई स्पष्ट वापसी undefined) functionName सिर्फ समारोह शरीर रिटर्न:

+0

तकनीकी रूप से आप फ़ंक्शन ऑब्जेक्ट को वापस लौट रहे हैं। इसके बाद आप फ़ंक्शन निष्पादित करने के लिए 'परिणाम() 'कॉल कर सकते हैं और कोई लौटाए गए मान प्राप्त कर सकते हैं। – musicfuel

+0

आपका कोड भी परिणामस्वरूप होता है, स्ट्रिंग – ambes

+0

@musicfuel के रूप में पूरा फ़ंक्शन - मैंने जो लिखा है वह नहीं है .. .. अतिरिक्त संपत्ति की सामग्री, जो ** ** ** कार्य है "? – adeneo

1

यह काफी आसान है। एक ही सिद्धांत काम करता है जब कोई फ़ंक्शन ऑब्जेक्ट प्रॉपर्टी होता है, जैसे आपके पास obj.add था।

0

फ़ंक्शन को कॉल करने के लिए() क्योंकि वे फ़ंक्शन आमंत्रण ऑपरेटर हैं। फ़ंक्शन निष्पादित करने के लिए आपको हमेशा कोष्ठक शामिल करने की आवश्यकता होगी।

जब आप ambes.add पर कॉल करते हैं तो आप फ़ंक्शन ऑब्जेक्ट को वापस लौट रहे हैं। यदि आप console.log() के अंदर ऐसा करते हैं या इसे स्ट्रिंग पर जोड़ते हैं तो जावास्क्रिप्ट फ़ंक्शन परिभाषा को एक पूर्ण स्ट्रिंग के रूप में वापस कर देगा जो आपको प्राप्त होने वाले पहले आउटपुट को बताता है।

0

आपको जावास्क्रिप्ट में किसी फ़ंक्शन को कॉल करने के लिए() का उपयोग करना होगा।

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

अपनी स्थिति में, क्योंकि आप को जोड़ने के कॉल करने के लिए सही दूर चाहते हैं, तो आप का उपयोग करने के लिए सुनिश्चित किया जाना चाहिए()

obj.add(); 
संबंधित मुद्दे