如何在函数中调用函数作为回调参数?

时间:2017-05-16 14:17:36

标签: javascript function

我是JS世界的初学者,我有一个问题。 当我在学习.forEach()javascript函数时,我注意到它需要2个参数,第一个是函数,第二个是This obj的值,正常用法如下:

function logArrayElements(element, index, array) {
  console.log('a[' + index + '] = ' + element);
}

// Notice that index 2 is skipped since there is no item at
// that position in the array.
[2, 5, , 9].forEach(logArrayElements);

但我也注意到它也可以这样调用:

示例num 2:

 [2, 5, , 9].forEach(function(){
console.log(arguments);
});

如果.forEach()函数将回调函数作为参数,第二个示例如何正确,因为它接受函数定义而不是对将被调用的函数的引用,

我的意思是为什么它接受第二个例子中的函数定义,虽然它需要一个已定义的函数名?

我的意思是forEach只需要一个函数的引用,所以当它在每个元素上循环时,它只会添加()到函数引用,所以函数将被调用

4 个答案:

答案 0 :(得分:2)

javascript中的

函数定义将指针返回给该函数。你也可以使用像

这样的语法
let myFunction = function() { ... } // define function and save it into variable
myFunction() // call the defined function

所以按名称传递函数和传递函数定义是一回事

答案 1 :(得分:1)

在第二个示例中,参数是一个匿名函数,与您首先定义函数并使用它的引用传递给.forEach()的第一个函数相比。所以,两者基本相同。您还可以编写第二个示例,如

[2, 5, , 9].forEach(function(element, index, array){
    //do something with element
});

答案 2 :(得分:1)

如果查看Polyfill它的作用是首先检查传递的回调类型是否为函数,如果不是则抛出错误,否则使用call()调用该函数,因此它的匿名函数或函数声明无关紧要。

它还会检查传递的参数数量是> 1还是回调后还有一个参数,您可以在回调中使用this访问该参数。

function invoke(callback) {
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function');
  }

  if (arguments.length > 1) var Obj = arguments[1];

  var value = 1;
  callback.call(Obj, value);

}

invoke(function(e) {
  console.log(this)
  console.log(1 + e)
}, {foo: 'bar'})

var another = function(e) {
  console.log(10 + e)
}

invoke(another);

答案 3 :(得分:0)

要达到您需要的正确答案: 阅读正确的标记答案评论(最后评论),然后阅读答案 Nenad Vracar ,因为他们都覆盖了我错过的方法,感谢他们两个。