【问题标题】:Javascript - unable to understand function parenthesesJavascript - 无法理解函数括号
【发布时间】:2017-07-06 06:34:42
【问题描述】:

我很困惑如何调用函数。有时它们以functionName() 格式给出,有时只是名称functionName

例如在 HTML 中,当我们调用 onclick="functionName()" 但在 Javascript 中我们只是将函数 functionName 作为参数传递给另一个函数。 setTimeout(functionName, 1000);

这是书中的一个例子,假设我们必须传递一个带有参数的回调函数。

var mySetTimeout = function(callback, delay){
  var dollars = 100;
  callback(dollars);
};
var onCompletion = function(dollars,name){
  console.log(name + ": Here's your $" + dollars);
};
var getMoney = function (name) {
  var requestB = mySetTimeout(function(dollars){
    onCompletion(dollars,name);
  }, 1000);
};
getMoney('Simon');

mySetTimeout 函数中,我们将回调作为参数传递,但其中没有任何内容。但稍后在 mySetTimeout 函数中,我们将使用参数传递回调函数。

谁能解释一下所有的情况?谢谢!

【问题讨论】:

  • 正如我在 MD_N mdn.beonex.com/en/DOM/window.setTimeout.html 中看到的那样,您可以将一个函数传递给 SetTimeOut ,或者尝试查看您的代码,为其保留日志。
  • 你可以在这个链接中看到函数声明和表达式的区别。 stackoverflow.com/a/11146853/1856338
  • 抱歉,回调函数就是这样工作的:)
  • 您理解正确:“我们只是将函数作为参数传递给另一个函数”。它接受对函数对象的引用并将其传递。后来在mySetTimeout里面,当callback跟括号一起使用的时候,其实是的。

标签: javascript


【解决方案1】:

你需要了解一些关于回调函数、匿名函数等的知识才能得到这个想法。在 JS 中使用匿名函数是很常见的。

我会尽量以最简单的方式向您解释。在您的代码中,在第一行:参考我的评论。

var mySetTimeout = function(callback, delay){ // Note 01
  var dollars = 100;
  callback(dollars); // Note 02
};

注意01:这里,回调只不过是一个字符串参数。它不是一个函数,而是一个函数名。您告诉您要运行一个名为“回调”的函数并传递该名称。然后,您只需调用 callback() 即可运行该函数,其中“回调”是您在上面传递给该函数的参数。

注意 02: 在这里,您实际上使用上面定义的名称运行了一个函数。

在这行代码中,

  var requestB = mySetTimeout(function(dollars){
    onCompletion(dollars,name);
  }, 1000);

您可以看到,您已经定义了函数本身,而不是“回调”字符串参数,因为在“mySetTimeout”函数内部,它将第一个参数作为函数运行。

所以基本上,你可以做如下相同的事情:

var myCallbackFunction = function(dollars){
    onCompletion(dollars,name);
  };

var requestB = mySetTimeout(myCallbackFunction, 1000);

现在您看到第一个参数包含一个函数,当在“mySetTimeout”函数中调用该函数时,您上面定义的函数将实际运行。基本上,我试图解释你可以在一个变量中保存一个函数。这就是匿名函数 / lambda 函数的目的。

我试图以最简单的方式向您解释这一点。希望这可以帮助。谷歌“JavaScript 匿名函数”,你会学到很多东西。

【讨论】:

  • 谢谢。总而言之,一个函数被引用时不带括号(当作为参数传递给其他函数时)只是用它的名字functionName,不管它有多少参数。再次感谢!肯定会谷歌这个。 :)
  • 这不是您引用的函数。您将函数分配给一个变量,然后将该变量作为参数传递。说 var func = function(){..}。现在,变量“func”拥有一个函数。你可以传递这个变量,如果你不想,你可以在以后销毁它。这就是匿名函数的全部目的(不让全局命名空间中的函数运行一次就忘记了。)
【解决方案2】:

mySetimeout 函数有两种使用方式:

语法:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

var timeoutID = window.setTimeout(code, delay);

希望这会有所帮助:)

【讨论】:

  • 这和我问的完全不同。
  • 我问的不是参数,而是有参数和无参数引用函数的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多