簡體   English   中英

函數調用中“()”的含義是什么?

[英]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方法,原因與避免使用evalFunction構造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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM