在Javascript中关闭循环内部

时间:2017-12-30 14:10:07

标签: javascript jquery html closures

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

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
        function sendName() {
            alert(arr[i]);
        }
    }
    return sendName;
}
var receiveName = getName();
receiveName();

5 个答案:

答案 0 :(得分:2)

您可以使用bind功能来实现您的目标:

&#13;
&#13;
function sendName( name ) {
  alert( name );
}

function getNames() {
  const arr = [ 'a','b','c','d' ];
  let sendNames = []; //Dunno what you want to do with this functions so let's store them in an array
  for(let i = 0; i < arr.length; i++) {
    sendNames.push(sendName.bind(this, arr[i])); // this - context, later arguments
  }
	return sendNames;
}
var receivedNames = getNames();
receivedNames[1](); //b
receivedNames[3](); //d
&#13;
&#13;
&#13;

答案 1 :(得分:1)

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

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
        (function() {
            alert(arr[i]);
        })(i);
    }
}
getName();

此外,正如其他人在评论中提到的那样,在您提供有关您为什么需要它的更详细解释之前,这种实施没有多大意义。可能应该有更优雅的解决方案,以满足您的要求。

答案 2 :(得分:1)

您可以使用数组来存储不同的功能。此示例将根据N返回不同的字母。

&#13;
&#13;
function getName() {
const arr=['a','b','c','d'];
  let a = [];
	for(let i = 0;i<arr.length;i++) {
		a.push(function () {
			alert(arr[i]);
		});
	}
	return a;
}
var receiveName=getName();
let N = 0; // returns a
receiveName[N]();
console.log(receiveName);
&#13;
&#13;
&#13;

希望有所帮助

答案 3 :(得分:1)

我认为没有必要将alert(a[i])包装在函数范围内,因为我们已经在使用let并且它提供了一个块范围。

我们可以使用以下功能,它可以输出所需的结果。

function getName() {
    const arr = ['a', 'b', 'c', 'd'];
    for (let i = 0; i < arr.length; i++) {
            alert(arr[i]);
    }
}
getName();

答案 4 :(得分:0)

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

function sendName(){
 alert(arr[i]);
    }

sendName正在将其指定值更改四次,但只调用一次,因此它仅警告“d”,因为d是指定的最后一个值。 如果要提醒“a”,“b”,“c”,“d”,请在循环内调用该函数。