我有一个简单的函数,它的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();
答案 0 :(得分:2)
您可以使用bind
功能来实现您的目标:
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;
答案 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
返回不同的字母。
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;
希望有所帮助
答案 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”,请在循环内调用该函数。