我实际上想要更新我之前的问题Javascript understanding return,因为下面的代码与之前的代码非常相似,但由于该问题已经回答,我决定发布此问题。我以前的问题的代码已经很好了,但我想满足我的一些好奇心所以我试验了代码并移动了返回的namePosition,
function positionIdentifier(name, nameArray) {
var namePosition;
for (i = 0; i < nameArray.length; i++) {
if (nameArray[i] == name) {
namePosition = function() {
alert("Your name is in position number " + (i + 1));
}
}
}
return namePosition;
}
name1Array = ["look", "sky", "walk", "kier"];
positionIdentifier("walk", name1Array)();
为什么警告错误的位置(i + 1)?相反,它会警告最终位置,即阵列的长度。
答案 0 :(得分:0)
我的朋友在javascript中被称为闭包。
function() {
alert("Your name is in position number " + (i + 1));
}
当调用 positionIdentifier 函数时, i 具有 中的最后一个值 循环。
要解决此问题,您需要执行此操作
function positionIdentifier(name, nameArray) {
var namePosition;
for (i = 0; i < nameArray.length; i++) {
if (nameArray[i] == name) {
/* now this will keep the correct value of i */
namePosition = (function(i) {
return function(){
alert("Your name is in position number " + (i + 1));
}
})(i)
/* now this will keep the correct value of i */
}
}
return namePosition;
}
这是一个工作小提琴https://jsfiddle.net/uxyot51b/
答案 1 :(得分:0)
你忘了在这里使用break语句是正确的代码:
<script>
function positionIdentifier(name, nameArray) {
var namePosition;
for (i = 0; i < nameArray.length; i++) {
if (nameArray[i] == name) {
namePosition = function () {
alert("Your name is in position number " + (i + 1));
};
break;
}
}
return namePosition;
}
name1Array = ["look", "sky", "walk", "kier"];
positionIdentifier("walk", name1Array)();
</script>