Javascript中循环内的闭包

Javascript中循环内的闭包,javascript,jquery,html,closures,Javascript,Jquery,Html,Closures,我有一个简单的函数,它的for循环中有另一个函数。main函数返回子函数。调用主函数时,循环运行,但子函数尚未执行,因为它尚未被调用。子函数在循环执行后调用,因此i的值指向数组的最后一个元素的值。如果我想让它对数组中的每个值都有一个新的绑定,我该如何修复它 函数getName(){ 常数arr=['a','b','c','d']; for(设i=0;i

我有一个简单的函数,它的for循环中有另一个函数。main函数返回子函数。调用主函数时,循环运行,但子函数尚未执行,因为它尚未被调用。子函数在循环执行后调用,因此
i
的值指向数组的最后一个元素的值。如果我想让它对数组中的每个值都有一个新的绑定,我该如何修复它

函数getName(){ 常数arr=['a','b','c','d']; for(设i=0;ireceiveName()您可能希望改用匿名包装:

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
        (function() {
            alert(arr[i]);
        })(i);
    }
}
getName();
函数getName(){ 常数arr=['a','b','c','d']; for(设i=0;i
另外,正如其他人在评论中提到的,在您提供关于为什么需要它的更详细解释之前,这种实现没有什么意义。可能应该有更优雅的解决方案来满足您的需求。

您可能希望使用匿名包装:

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
        (function() {
            alert(arr[i]);
        })(i);
    }
}
getName();
函数getName(){ 常数arr=['a','b','c','d']; for(设i=0;i
另外,正如其他人在评论中提到的,在您提供关于为什么需要它的更详细解释之前,这种实现没有什么意义。可能应该有更优雅的解决方案来满足您的需求。

您可以使用
bind
功能来实现您想要的:

函数sendName(name){
警报(名称);
}
函数getNames(){
常数arr=['a'、'b'、'c'、'd'];
让sendNames=[];//不知道您想用这个函数做什么,所以让我们将它们存储在一个数组中
for(设i=0;i收到姓名[3]()//d
您可以使用
bind
功能实现您想要的:

函数sendName(name){
警报(名称);
}
函数getNames(){
常数arr=['a'、'b'、'c'、'd'];
让sendNames=[];//不知道您想用这个函数做什么,所以让我们将它们存储在一个数组中
for(设i=0;i收到姓名[3]()//您可以使用数组来存储不同的函数。此示例将根据
N
返回不同的字母

函数getName(){ 常数arr=['a','b','c','d']; 设a=[];
对于(设i=0;i可以使用数组存储不同的函数。此示例将根据
N
返回不同的字母

函数getName(){ 常数arr=['a','b','c','d']; 设a=[];
对于(设i=0;i我认为没有必要在函数范围中包装
警报(a[i])
,因为我们已经在使用
let
,它提供了一个块范围

我们可以使用下面的函数,它可以输出所需的结果

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
            alert(arr[i]);
    }
}
getName();
函数getName(){ 常数arr=['a','b','c','d']; for(设i=0;i
我认为没有必要在函数范围中包装
警报(a[I])
,因为我们已经在使用
let
,它提供了一个块范围

我们可以使用下面的函数,它可以输出所需的结果

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
            alert(arr[i]);
    }
}
getName();
函数getName(){ 常数arr=['a','b','c','d']; for(设i=0;i这是因为它只被调用一次,即。。。 即使

function sendName(){
 alert(arr[i]);
    }
sendName更改其赋值四次,但只调用了一次,因此它只向“d”发出警报,因为d是最后一个赋值。
如果要提醒“a”、“b”、“c”、“d”,请调用循环内的函数。

这是因为它只被调用一次,即。。。 即使

function sendName(){
 alert(arr[i]);
    }
sendName更改其赋值四次,但只调用了一次,因此它只向“d”发出警报,因为d是最后一个赋值。
如果你想提醒“a”、“b”、“c”、“d”,调用循环中的函数。

你所问的似乎没有意义。你只需调用
getName()
,它会返回一个函数供以后调用。这个调用怎么可能“对每个值都有一个新的绑定”?这是
getName()的一个结果
。也许您可以返回一个函数数组?您的代码甚至不能在严格模式下工作,因为返回的
sendName
变量不存在。这是您更大问题的一部分:您的
getName()
只返回一个函数。您甚至如何调用指向不同索引的不同函数(这是由于在循环中使用了
let
,实际上已经起作用的部分)。可能重复您所要求的内容似乎没有意义。您对
getName()
进行了一次调用,该调用将返回一个稍后调用的函数。该调用如何“对每个值进行新绑定”?这是来自
getName()
的单个结果。也许您可以返回一个函数数组?您的代码甚至不能在严格模式下工作,因为返回的
sendName
变量不存在。这是您更大问题的一部分:您的
getName()
只返回一个函数。您如何调用指向不同索引的不同函数