2009-02-27 36 views
7

爲什麼這項工作..JavaScript語法:函數調用和使用括號

<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:類型不匹配。」當通過VS2008進行編譯時。

回答

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

呵呵。 「function(){return 1;}();」是語法錯誤,但「(function(){return 1;}())」不是。愚蠢的JavaScript和你的單獨的函數語句和表達式... – 2009-02-27 04:46:32

5

addEventListener函數期望實現EventListener作爲第二個參數,而不是函數調用的函數或對象。

()添加到函數名稱時,它是函數調用而不是函數本身。

編輯:正如其他回覆和評論中指出的那樣,可以用Javascript返回函數。

因此,對於一些有趣的事情,我們可以嘗試以下方法。從最初的myAlert,我們可以改變它一點點返回不同的消息,這取決於參數:

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

這裏,通知該函數實際上返回的功能。因此,爲了調用該功能,將需要額外的()

我寫了一點HTML和Javascript來使用上面的函數。 (請原諒我的不乾淨的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

是的,函數可以返回函數(如後面的答案顯示) – 2009-02-27 04:30:11

2

當你使用你實際上調用該函數,你要發送的功能結果(在這種情況下,不確定,因爲myAlert沒有返回值)作爲參數的括號。

0

還值得注意的是,函數是一流的對象。你可以像任何其他物體一樣折騰它們。這就是爲什麼這是很酷的,從Wikipedia一個不錯的簡潔例如:使用myAlert()這裏

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()); 
} 

正在給函數,而不是函數本身的返回值。

考慮一下:

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); 
    }); 
} 

JavaScript使用一流的功能,因此可以作爲參數傳遞給函數是什麼的addEventListener和的attachEvent方法期待。希望有所幫助。