[英]What's the meaning of “()” in a function call?
現在,我通常用()
調用一個函數(不需要參數),如下所示:
myFunction(); //there's empty parens
除了jQuery調用,我可以逃脫:
$('#foo').bind('click', myFunction); //no parens
精細。 但最近我看到這個評論這里的SO:
“考慮使用setTimeout(monitor, 100);
而不是setTimeout('monitor()', 100);
;. Eval是邪惡的:)”
哎呀! 我們真的在這里eval()
字符串嗎? 我想我並不真正理解“調用”函數的意義和含義。 有關調用和引用函數的真正規則是什么?
在JavaScript中,函數是第一類對象。 這意味着您可以將函數作為參數傳遞給函數,或者將它們視為變量。
假設我們正在談論一個函數hello
,
function hello() {
alert('yo');
}
當我們簡單地寫
hello
我們指的是不執行它的內容的函數。 但是當我們在函數名之后添加parens ()
,
hello()
然后我們實際上調用了將在屏幕上提醒“yo”的功能。
jQuery中的bind
方法接受事件類型(字符串)和函數作為其參數。 在您的示例中,您將傳遞類型 - “單擊”和實際函數作為參數。
你見過Inception嗎? 考慮這個可能使事情更清晰的人為例子。 由於函數是JavaScript中的第一類對象,我們可以在函數內傳遞和返回函數。 因此,讓我們創建一個在調用時返回函數的函數,返回的函數在調用時也返回另一個函數。
function reality() {
return function() {
return function() {
alert('in a Limbo');
}
};
}
這里的reality
是一種功能, reality()
是一種功能,而reality()()
也是一種功能。 然而, reality()()()
不是一個函數,而是簡單地undefined
因為我們沒有從最里面的函數返回一個函數(我們沒有返回任何東西)。
因此,對於reality
函數示例,您可以將以下任何內容傳遞給jQuery的bind。
$('#foo').bind('click', reality);
$('#foo').bind('click', reality());
$('#foo').bind('click', reality()());
你的jQuery bind
示例類似於setTimeout(monitor, 100);
,您將函數對象的引用作為參數傳遞。
應該避免將字符串傳遞給setTimeout
/ setInterval
方法,原因與避免使用eval
和Function
構造eval
原因相同。
作為字符串傳遞的代碼將在全局執行上下文中進行評估和運行,這可以為您提供“范圍問題”,請考慮以下示例:
// a global function
var f = function () {
alert('global');
};
(function () {
// a local function
var f = function() {
alert('local');
};
setTimeout('f()', 100); // will alert "global"
setTimeout(f, 100); // will alert "local"
})();
上例中的第一個setTimeout
調用將執行全局f
函數,因為計算出的代碼無法訪問匿名函數的本地詞法范圍。
如果在第二個setTimeout
調用中將函數對象的引用傳遞給setTimeout
方法,則將執行您在當前范圍中引用的完全相同的函數。
您在jQuery示例中沒有像在第二個setTimeout
示例中那樣做同樣的事情 - 在您的代碼中,您傳遞函數並綁定click
事件。
在第一個setTimout
示例中, monitor
函數被傳入並可以直接調用,在第二個中,sting monitor()
被傳入並需要進行eval
。
傳遞函數時,使用函數名稱。 調用它時,您需要使用()
。
Eval將調用傳入的內容,因此成功調用函數需要a ()
。
首先,“()”不是函數名稱的一部分。 它是用於進行函數調用的語法。
首先,通過使用函數聲明將函數綁定到標識符名稱:
function x() {
return "blah";
}
...或使用函數表達式:
var x = function() {
return "blah";
};
現在,只要你想運行這個函數,就可以使用parens:
x();
setTimeout函數接受函數的兩者和標識符,或作為第一個參數的字符串...
setTimeout(x, 1000);
setTimeout("x()", 1000);
如果提供標識符,則它將作為函數調用。 如果提供字符串,則將對其進行評估(執行)。
第一種方法(提供標識符)是首選...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.