我设置了一个初始标志,然后执行foreach,这会将标志更改为一个不同的值,但在foreach循环之外,我仍然可以看到原始标志。就好像什么都没变一样。但是它确实在foreach循环中发生了变化。
该值仅在foreach循环内更改,而不会在它的外部更改。
我看到了许多类似的问题,但它们都处理实际的数组值,在本例中,它是foreach循环外部的一个简单变量。
var arr = ["one"];
var str = 0;
arr.forEach(function(part){
if(part == 'one') {
var str = 1;
console.log('str changed to: ' + str);
}
})
console.log('str is now: ' + str);
这将返回
str changed to: 1
str is now: 0
根据我上面的逻辑应该返回"str is now: 1",为什么它的原始值是0?
发布于 2019-05-23 06:56:16
这是因为您在循环中使用var
重新声明了变量,而不仅仅是更新/设置它。重新声明它将清除上一次循环迭代中具有相同名称的早期变量,并在更高的作用域中隐藏函数中的变量。它建立一个新的,而不是仅仅更新现有的值。
var arr = ["one"];
var str = 0;
arr.forEach(function(part){
if(part == 'one') {
str = 1;
console.log('str changed to: ' + str);
}
})
console.log('str is now: ' + str);
发布于 2019-05-23 06:57:02
问题是您在forEach
中声明了一个新的str
变量。只需放下var
,它就会工作。
var arr = ["one"];
var str = 0;
arr.forEach(function(part) {
if (part == 'one') {
str = 1; // Notice the lack of var
console.log('str changed to: ' + str);
}
});
console.log('str is now: ' + str);
发布于 2019-05-23 07:03:33
只是作为一个额外的答案,它想要提出一种不同的方法来完成您正在使用forEach
所做的事情
Array.prototype.some()
在这方面做得很好。它测试是否有任何数组元素满足您传递给它的回调函数中的条件。
let arr = ["two", "one", 7];
let str = 0;
str = arr.some(part => part === 'one') ? 1 : str;
console.log('str is now: ' + str);
https://stackoverflow.com/questions/56265987
复制相似问题