2009-02-27 44 views
7

का उपयोग कर क्यों करता है यह काम ..जावास्क्रिप्ट वाक्य रचना: फ़ंक्शन कॉल और कोष्ठक

<script type="text/javascript"> 
<!-- 

function myAlert(){ 
    alert('magic!!!'); 
} 


if(document.addEventListener){ 
    myForm.addEventListener('submit',myAlert,false); 
}else{ 
    myForm.attachEvent('onsubmit',myAlert); 
} 
// --> 
</script> 

लेकिन यह नहीं ????

<script type="text/javascript"> 
<!-- 

function myAlert(){ 
    alert('magic!!!'); 
} 


if(document.addEventListener){ 
    myForm.addEventListener('submit',myAlert(),false); 
}else{ 
    myForm.attachEvent('onsubmit',myAlert()); 
} 
// --> 
</script> 

अंतर जब myAlert समारोह बुला कोष्ठक के उपयोग किया जा रहा है।

त्रुटि मैं ..

"htmlfile: प्रकार बेमेल।" वीएस -2008 के माध्यम से संकलन करते समय।

उत्तर

29

() एक समारोह का मतलब के बाद अमल समारोह ही है और यह मूल्य है लौटने। इसके बिना आपके पास बस कार्य है, जो कॉलबैक के रूप में पास करने के लिए उपयोगी हो सकता है।

var f1 = function() { return 1; }; // 'f1' holds the function itself, not the value '1' 
var f2 = function() { return 1; }(); // 'f2' holds the value '1' because we're executing it with the parenthesis after the function definition 

var a = f1(); // we are now executing the function 'f1' which return value will be assigned to 'a' 
var b = f2(); // we are executing 'f2' which is the value 1. We can only execute functions so this won't work 
+0

हू। "फ़ंक्शन() {वापसी 1;}();" एक वाक्यविन्यास त्रुटि है, लेकिन "(फ़ंक्शन() {वापसी 1;}())" नहीं है। मूर्खतापूर्ण जावास्क्रिप्ट और आपके अलग फ़ंक्शन स्टेटमेंट्स और एक्सप्रेशन ... –

+0

@ सिमॉन: "फ़ंक्शन() {वापसी 1;}();" केवल एक वाक्यविन्यास त्रुटि है जब एक चर को आवंटित नहीं किया जाता है। –

5

addEventListener समारोह एक समारोह या किसी वस्तु दूसरा तर्क, नहीं एक समारोह कॉल के रूप में EventListener को लागू करने की उम्मीद है।

जब () फ़ंक्शन नाम में जोड़े जाते हैं, तो यह फ़ंक्शन के बजाए एक फ़ंक्शन आमंत्रण होता है।

संपादित करें: जैसा कि अन्य प्रतिक्रियाओं और टिप्पणियों में दर्शाया गया है, जावास्क्रिप्ट में कार्यों को वापस करना संभव है।

तो, कुछ दिलचस्प के लिए, हम निम्नलिखित कोशिश कर सकते हैं। मूल myAlert से, हम यह एक छोटे से एक अलग संदेश लौटने के लिए बदल सकते हैं मापदंडों के आधार पर:

function myAlert(msg) 
{ 
    return function() 
    { 
     alert("Message: " + msg); 
    } 
} 

इधर, सूचना है कि समारोह वास्तव में एक समारोह देता है। इसलिए, उस समारोह को आमंत्रित करने के लिए, अतिरिक्त () आवश्यक होगा।

मैंने उपरोक्त फ़ंक्शन का उपयोग करने के लिए एक छोटा HTML और जावास्क्रिप्ट लिखा था। (कृपया मेरी अशुद्ध HTML और Javascript बहाना, के रूप में यह मेरे डोमेन नहीं है):

<script type="text/javascript"> 

function myAlert(msg) 
{ 
    return function() 
    { 
     alert("Message: " + msg); 
    } 
} 

</script> 

<html> 
<body> 

<form> 
<input type="button" value="Button1" onclick="myAlert('Clicked Button1')()"> 
<input type="button" value="Button2" onclick="myAlert('Clicked Button2')()"> 
</form> 

</body> 
</html> 

दो बटन दिखाए जाते हैं, और प्रत्येक एक अलग पैरामीटर के साथ myAlert समारोह कॉल करेंगे। एक बार myAlert फ़ंक्शन को कॉल करने के बाद, यह स्वयं एक और function लौटाएगा ताकि इसे ब्रांड्स के अतिरिक्त सेट के साथ बुलाया जाना चाहिए।

अंतिम परिणाम Button1 पर क्लिक संदेश Message: Clicked Button1 के साथ एक संदेश बॉक्स दिखाई देगा, जबकि Button2 पर क्लिक एक संदेश बॉक्स Message: Clicked Button2 कह दिखाई देगा, है।

+0

हां, फ़ंक्शंस फ़ंक्शन वापस कर सकता है (बाद के उत्तरों के रूप में) –

2

जब आप कोष्ठक आप वास्तव में समारोह लागू कर रहे हैं और आप समारोह परिणाम भेज रहे हैं (इस मामले अपरिभाषित में क्योंकि myAlert एक वापसी मूल्य नहीं है) पैरामीटर के रूप में इस्तेमाल करते हैं।

0

यह भी ध्यान देने योग्य है कि कार्य प्रथम श्रेणी की वस्तुएं हैं। आप उन्हें किसी अन्य वस्तु की तरह टॉस कर सकते हैं।यहां इसका कारण यह शांत है, Wikipedia से का एक अच्छा संक्षिप्त उदाहरण है:

function makeDerivative(f, deltaX) { 
    var deriv = function(x) { 
     return (f(x + deltaX) - f(x))/ deltaX; 
    } 

    return deriv; 
} 

var cos = makeDerivative(Math.sin, 0.000001); 
0
if(document.addEventListener){ 
    myForm.addEventListener('submit',myAlert(),false); 
}else{ 
    myForm.attachEvent('onsubmit',myAlert()); 
} 

यहाँ myAlert() का उपयोग कर समारोह, नहीं समारोह के ही दिए गए मान दे रहा है।

function bob() { 
    return "hello world"; 
} 

alert(bob()); 

चेतावनी समारोह bob द्वारा दिए गए मान का उपयोग करने के लिए जा रहा है:

इस पर विचार करें।

आप आप में अतिरिक्त पैरामीटर पारित करने के लिए addEventListener चाहते हैं, इस प्रयास करें:

if(document.addEventListener){ 
    myForm.addEventListener('submit',function(event) { 
     myAlert(event,myOtherParamater); 
    },false); 
}else{ 
    myForm.attachEvent('onsubmit',function() { 
     myAlert(window.event,myOtherParameter); 
    }); 
} 

जावास्क्रिप्ट प्रथम श्रेणी के कार्यों का उपयोग करता है और इस तरह के कार्यों के लिए पैरामीटर के रूप में पारित किया जा सकता है जो addEventListener और attachEvent तरीकों उम्मीद कर रहे हैं । उम्मीद है की वो मदद करदे।

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