javascript:使用let vs none进行范围界定

时间:2018-07-28 21:24:02

标签: javascript

我有一个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)
}

4 个答案:

答案 0 :(得分:5)

如果您不使用letvarconst来定义变量,那么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

没有发言

变量应使用letconstvar声明。 忽略它们是一个错误,因为变量在全局范围内终止,会产生全局范围污染,并且难以跟踪或调试。

它也可能导致变量覆盖(错误,意外行为...)

  

如果您的代码在"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;} }