我是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只需要一个函数的引用,所以当它在每个元素上循环时,它只会添加()到函数引用,所以函数将被调用
答案 0 :(得分:2)
函数定义将指针返回给该函数。你也可以使用像
这样的语法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 ,因为他们都覆盖了我错过的方法,感谢他们两个。