【问题标题】:Calling functions inside of loops and methods doesn't require ()? [duplicate]在循环和方法内部调用函数不需要()? [复制]
【发布时间】:2016-08-26 12:29:40
【问题描述】:

为什么我不需要使用() 在“for”循环或“.addEventListener()”方法中调用函数?例如:

function activitiesReset() 
  {activitiesLegend.style = '';
}   

for (var i=0; i<checkboxes.length; i++) {
  checkboxes[i].addEventListener('change', activitiesReset);
}

在 addEventListener 方法中,我首先尝试像 activitiesReset() 这样调用我的函数,但这不起作用。从函数末尾删除 () 有效。

这是为什么呢?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    checkboxes[i].addEventListener('change', activitiesReset) 没有调用activitiesReset。它传递 activitiesReset 作为参数。 activitiesReset 本身就是一个函数; activitiesReset() 是对函数的调用,计算其返回值。您希望将事件侦听器设置为您的函数,而不是 undefined(这是调用您的函数的结果)。

    理解这一点的关键是 JavaScript 中的函数也是值,就像数字、字符串或对象一样。 (实际上,它们是一种特定的对象。)

    var adderFuncValue = function(x, y) { return x + y; };
    function multiplierFuncValue(x, y) { return x * y; };
    
    function callFuncWithTwoParams(func, p1, p2) {
      func(p1, p2);
    }
    
    callFuncWithTwoParams(adderFuncValue, 3, 5); // 8
    callFuncWithTwoParams(multiplierFuncValue, 2, 3); // 6
    var someFunc = adderFuncValue;
    someFunc(7, 8); // 15
    

    就像我将函数值传递给callFuncWithTwoParams 一样,您将函数值传递给addEventListener。浏览器会记住该函数并将其与change 事件相关联,然后调用它。

    【讨论】:

    • 非常感谢。优雅地解释 - 我很惊讶我在 2 个月内不知道这一点。抱歉发布了一个重复的问题 - 我先尝试了谷歌,但不知何故错过了它。 Downvotes 压垮了我的灵魂,有一段时间没有我的帖子了:/
    • 不用担心单次投反对票;此外,如果您有一段时间没有来过这里,您不会被期望知道有人曾经写过相同问题的答案;我不认识自己,所以我回答了。
    猜你喜欢
    • 2015-05-11
    • 2020-11-27
    • 1970-01-01
    • 2011-02-14
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多