繁体   English   中英

JavaScript let 和 var 用法

[英]JavaScript let and var usage

不久前,我读了一些关于在 JavaScript 中使用 let 和 var 的文章,他们说你使用“var”关键字(甚至在 for 循环中)声明的变量只能在它的函数内工作,那么为什么可以创建多个for 循环在一个函数中,每个循环看起来像: for (var i = 0; i < array.length; i++); 并且 JavaScript 对“重新声明” i 变量没有问题? 谢谢 :)

JS 对var有一个特殊情况,因为它允许提升,这意味着允许对相同变量进行多次声明,并且它们被移动到封闭的功能范围内。 然而,它们仍然是相同的变量。 考虑以下代码:

function foo(){
 for(var i=0; i<3; i++){
  console.log("x");
 }
 for(var i;i<6;i++){
  console.log("y");
 }
}

foo()

注意在第二个循环中没有初始化 i ,但它会执行得很好并产生 3 x和 3 y 它曾经是旧浏览器的问题,但新浏览器只是允许它而不会给出错误。

看似小问题却有复杂答案。 var是旧的方法声明。 您可以根据需要在任何地方多次声明它。 JavaScript 不会在意。 所有声明的变量都可以立即使用,因为声明会被移到函数代码的最开头。 这称为提升。

let是声明变量的新方法。 const存在,但我们现在对此不感兴趣。 let是块作用域。 let和 scoping 背后的规则可能会令人困惑,但学习/理解是有好处的。 它是 JavaScript 的未来。 我在我的博客文章中彻底讨论了它, 这里

let 赋予您声明限制在块范围内的变量的特权,与 var 不同的表达式语句。

var 是一个关键字,它定义全局变量,而不管块的作用域如何。

ES6 引入了 'let' 关键字来解决这个问题。 它允许在函数内将变量绑定到其作用域,这样您就无法在防止提升问题的情况下重新声明它。 例子 -

for(var i=0; i<5; i++) {
    console.log(i);
}
console.log(i);

这里的输出将是 - 0 1 2 3 4 5而不是 5 我们必须得到“未捕获的引用错误”,因为变量 i 应该只能在函数内访问。 由于 JavaScript 中的 Hoisting,所有变量和函数名称在执行前都存储在一处。 所以代码实际上如下所示 -

var i;
for(i=0; i<5; i++) {
        console.log(i);
}
console.log(i);

如果您使用let关键字,则此问题已解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM