在循环和方法中调用函数不需要()?

时间:2016-08-26 04:21:09

标签: javascript

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

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

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

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

为什么?

1 个答案:

答案 0 :(得分:5)

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事件关联,并稍后调用它。