Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 作为函数中的回调参数调用函数是如何进行的?_Javascript_Function - Fatal编程技术网

Javascript 作为函数中的回调参数调用函数是如何进行的?

Javascript 作为函数中的回调参数调用函数是如何进行的?,javascript,function,Javascript,Function,我是JS世界的初学者,我有一个问题。 当我在研究.forEach()javascript函数时,我注意到它需要两个参数,第一个是函数,第二个是这个obj的值,正常用法如下: function logArrayElements(element, index, array) { console.log('a[' + index + '] = ' + element); } // Notice that index 2 is skipped since there is no item at /

我是JS世界的初学者,我有一个问题。 当我在研究.forEach()javascript函数时,我注意到它需要两个参数,第一个是函数,第二个是这个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);
但我也注意到它也可以这样称呼:

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);
示例2:

 [2, 5, , 9].forEach(function(){
console.log(arguments);
});
如果.forEach()函数采用回调函数作为参数,那么第二个示例的正确性如何,因为它采用的是函数定义,而不是对将被调用函数的引用

我的意思是,为什么在第二个示例中,它接受一个函数定义,尽管它接受一个已定义的函数名


我的意思是forEach只需要一个函数的引用,所以当它在每个元素上循环时,它只会将()添加到函数引用中,这样函数就会被调用,javascript中的函数定义会返回指向该函数的指针。您还可以使用如下语法

let myFunction = function() { ... } // define function and save it into variable
myFunction() // call the defined function

因此,按名称传递函数和传递函数定义是一样的,在第二个示例中,参数是匿名函数,而第一个示例中,您首先定义了函数并使用它的引用传递给.forEach()。因此,两者本质上是相同的。您还可以编写第二个示例,如

[2, 5, , 9].forEach(function(element, index, array){
    //do something with element
});
如果您看一下它的功能,它首先检查传递的回调类型是否为函数,如果不是,则抛出错误,否则它使用
call()
调用该函数,因此无论其匿名函数还是函数声明

它还检查传递的参数数是否为
1,或者回调后是否还有一个参数,您可以使用回调中的
this
访问该参数

函数调用(回调){
if(回调类型!==“函数”){
抛出新类型错误(回调+'不是函数');
}
如果(arguments.length>1)var Obj=参数[1];
var值=1;
callback.call(Obj,value);
}
调用(函数(e){
console.log(这个)
控制台日志(1+e)
},{foo:'bar'})
var=函数(e){
控制台日志(10+e)
}

调用(另一个)要获得正确答案,您必须:
阅读正确标记的答案注释(最后一条注释),然后阅读答案Nenad Vracar,因为这两条注释都涵盖了我错过的方法,谢谢它们。

forEach在第一个示例中添加了()来调用函数,在第二个示例中,添加了函数定义的方式,然后将其设置为参数,然后添加()要调用函数,逻辑是不公平的。@javascript中的youhana函数是第一类对象。第一个和第二个之间的唯一区别是,在第二个中,回调是在.forEach()中定义的。这在Javascript中是有效的。您的评论是正确的,我搜索并修改了这一点,发现函数表达式(匿名函数或未命名函数)返回的函数引用将等于已命名或已定义函数的引用,谢谢,您的回答也是最好的,但如果仅是forEach,我的问题是为什么在调用回调步骤之前执行该步骤,因为我想知道函数表达式的结果与命名函数引用的结果如何相同,市场上的评论正确地回答了这一点,但您的回答很好,为我提供了一种新的方法,谢谢您的时间。