Javascript 回调函数的参数是如何工作的?

Javascript 回调函数的参数是如何工作的?,javascript,arrays,asynchronous,callback,Javascript,Arrays,Asynchronous,Callback,我刚开始使用javascript,我不能真正理解回调函数是如何工作的。这听起来可能很愚蠢,但我有一些问题。如果不合适,我会删除 如果回调函数是作为参数传递给另一个函数的函数,那么回调函数的参数会发生什么变化 使用回调函数会执行它两次吗(当它被用作参数时执行一次,当它被声明时执行一次) 另外,我也不知道回调函数参数是如何获取数组中元素的值的 以您的代码片段为例,我们看到logPerson是一个函数。我们还使用Array.prototype.forEach在人的数组上循环 现在,forEach将函数

我刚开始使用javascript,我不能真正理解回调函数是如何工作的。这听起来可能很愚蠢,但我有一些问题。如果不合适,我会删除

如果回调函数是作为参数传递给另一个函数的函数,那么回调函数的参数会发生什么变化

使用回调函数会执行它两次吗(当它被用作参数时执行一次,当它被声明时执行一次)

另外,我也不知道回调函数参数是如何获取数组中元素的值的


以您的代码片段为例,我们看到
logPerson
是一个函数。我们还使用
Array.prototype.forEach
人的数组上循环

现在,forEach将函数作为参数,它使用参数作为每次迭代的项值和索引进行调用

因此,当我们将
logPerson
作为参数传递给
forEach
时,将使用forEach传递给其回调的参数调用此函数

forEach的一个简单实现可能如下

Array.prototype.forEach = function(callback) {
    const arr = this;
    for(let i = 0; i < arr.length; i++) {
        callback(arr[i], i);
    }
}

以您的代码片段为例,我们看到
logPerson
是一个函数。我们还使用
Array.prototype.forEach
人的数组上循环

现在,forEach将函数作为参数,它使用参数作为每次迭代的项值和索引进行调用

因此,当我们将
logPerson
作为参数传递给
forEach
时,将使用forEach传递给其回调的参数调用此函数

forEach的一个简单实现可能如下

Array.prototype.forEach = function(callback) {
    const arr = this;
    for(let i = 0; i < arr.length; i++) {
        callback(arr[i], i);
    }
}

那么forEach总是为每次迭代传递值和索引?Javascript如何知道将值放在person变量中,将索引放在index变量中?@L4M3它不知道。它只是将数组中的值作为第一个参数传递,将索引作为第二个参数传递。这些论点叫什么,由你自己决定。你可以把它们命名为
foo
bar
,你会得到相同的值。哦,好的,我明白了。如果我想跳过这个值,只获取索引,那该怎么做呢?最后一个问题是,回调函数会在声明函数时阻止它执行吗?抱歉,如果这很讨厌。@L4M3要仅获取索引,您需要第二个参数。因此,只需声明两个,不要使用第一个
(\ux,index)=>{console.log(index)}
,例如<代码>\u
是命名不想使用的参数的常用方法,但它可以是任何参数。如果您愿意,可以将其命名为
notGonnaUseThat
。和函数在声明时从不调用。只有当…嗯,当一些代码显式调用它们时,才会调用它们
fn=()=>console.log(“hello”)
只创建一个名为
fn
的函数。但是您需要
fn()
fn.call()
fn.apply()
或任何实际调用它的东西。谢谢,您不知道这有多大帮助。实际上,我考虑过放弃javascript,认为它对我来说太复杂了。我会继续推进,那么forEach每次迭代都会传递值和索引?Javascript如何知道将值放在person变量中,将索引放在index变量中?@L4M3它不知道。它只是将数组中的值作为第一个参数传递,将索引作为第二个参数传递。这些论点叫什么,由你自己决定。你可以把它们命名为
foo
bar
,你会得到相同的值。哦,好的,我明白了。如果我想跳过这个值,只获取索引,那该怎么做呢?最后一个问题是,回调函数会在声明函数时阻止它执行吗?抱歉,如果这很讨厌。@L4M3要仅获取索引,您需要第二个参数。因此,只需声明两个,不要使用第一个
(\ux,index)=>{console.log(index)}
,例如<代码>\u
是命名不想使用的参数的常用方法,但它可以是任何参数。如果您愿意,可以将其命名为
notGonnaUseThat
。和函数在声明时从不调用。只有当…嗯,当一些代码显式调用它们时,才会调用它们
fn=()=>console.log(“hello”)
只创建一个名为
fn
的函数。但是您需要
fn()
fn.call()
fn.apply()
或任何实际调用它的东西。谢谢,您不知道这有多大帮助。实际上,我考虑过放弃javascript,认为它对我来说太复杂了。不过我会继续努力。相关的:相关的: