我有一个forEach循环和一个嵌套在其中的for循环。为什么那个在for循环之外,但仍然在forEach循环中,我有word = foo
。然后可以将word
的值记录在整个forEach循环之外,但是,当我将其设为let word = "foo"
时,控制台日志语句将失败并显示word is not defined
?
function mainFunction() {
array.forEach(function (element, index) {
for (var key in list) {
//do something
}
word = "foo"
}
console.log(word)
}
答案 0 :(得分:5)
如果您不使用let
,var
或const
来定义变量,那么JavaScript会将word
变量隐式添加到全局对象中。
基本上,这个:
word = "foo"
与此相同:
window.word = "foo"
这被广泛认为是不良做法,通常表示有错误。这就是为什么大多数will mark this as an error的短毛猫。
答案 1 :(得分:2)
let语句声明一个块作用域局部变量,可以选择将其初始化为一个值。
function test(){
let x = 1;
if(x === 1) {
let x = 2;
console.log(x);// output: 2
}
console.log(x); //output: 1
}
test();
console.log(x); // Uncaught ReferenceError
变量应使用let
,const
或var
声明。
忽略它们是一个错误,因为变量在全局范围内终止,会产生全局范围污染,并且难以跟踪或调试。
它也可能导致变量覆盖(错误,意外行为...)
如果您的代码在
"strict mode"
(或模块内部)中运行,将触发错误。
function test(){
x = 1; // becomes window.x
if(x === 1) {
let x = 2;
console.log(x);// output: 2
}
console.log(x); //output: 1
}
test();
console.log(x); // output: 1
console.log(window.x); // output: 1
您应该在函数顶部声明变量。
function mainFunction(array) {
let word; // declare 'word' here
array.forEach(function (element, index) {
word = "foo";
})
console.log(word)
}
mainFunction([1,2,3,4])
答案 2 :(得分:0)
javascript中只有两个作用域:全局和局部。 The only thing that can create a scope is the function keyword。
通过首先查看本地范围来获取变量,如果未找到,则在链上方的父范围中进行搜索,直到找到为止。如果未找到并且未设置use strict
模式,则会在全局范围内为您创建auto
。
话虽如此,您可以看到将发生在word
范围内的变量forEach
中。在这种情况下,JS会执行许多人不希望做的事情,以及许多人使用use strict
模式的原因...它将在全局范围内为您添加它,因为它无法位于任何地方。范围链。
这总体上会引起许多问题,而这并不是许多人想要的行为。要停止此操作,您可以添加use strict
来告诉JS位于strict mode
'use strict';
var v = "Hi! I'm a strict mode script!"; // this is ok
b = 1 // ReferenceError: b is not defined"
这里没有use strict
var v = "Hi! I'm a NOT strict mode script!"; // this is ok
b = 1
console.log(b) // returns 1
答案 3 :(得分:0)
function mainFunction() {
array.forEach(function (element, index) {
for (var key in list) {
//do something
}
let word = "foo"
//word is defined here.
//word can call in {array.forEarch(...)}
}
//word is undefined here.
console.log(word)
}
总是let
叫来{...}。
例如:{ let a; ... {let b;} {let c;} }