繁体   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