JavaScript中的 let 和 var

简介: JavaScript中的 let 和 var

let 和 var


let 的诞生


在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。


ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。


let与var区别


let和var的区别体现在作用域上。var的作用域被规定为一个函数作用域,而let则被规定为块作用域,块作用域要比函数作用域小一些,但是如果两者既没在函数中,也没在块作用域中定义,那么两者都属于全局作用域。


全局作用域


var 和 let 声明的变量在全局作用域中被定义时,两者非常相似


let bar = 'let的';
var baz = 'var的'; 


但是,被let声明的变量不会作为全局对象window的属性,而被var声明的变量却可以


console.log(window.bar);  //undefined
console.log(window.baz); // 'able'


例如:



运行结果:



函数作用域


var 和 let 在函数作用域中声明一个变量,两个变量的意义是相同的。


function  aFun(){
    let bar = 'let的'; // 函数作用域中的变量
    var baz = 'var的'; // 函数作用域中的变量
}


块作用域


在块作用域中两者的区别较为明显, let只在for()循环中可用,而 var是对于包围for循环的整个函数可用


function  aFun1(){
    // i 对于for循环外的范围是不可见的(i is not defined)
    for(let i = 1; i<5; i++){
        //  i只有在这里是可见的
    }
    // i 对于for循环外的范围是不可见的(i is not defined)
}
function aFun2(){
    // i 对于for循环外的范围是可见的
    for(var i = 1;i<5; i++){
        // i 在for 在整个函数体内都是可见的
    }
    // i 对于for循环外的范围是可见的
}


小案例:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      function aFun1() {
        for (let i = 1; i < 5; i++) {
          //  i只有在这里是可见的
          console.log(i);
        }
        // i 对于for循环外的范围是不可见的(i is not defined)
        // console.log(i);
      }
      function aFun2() {
        for (var i = 1; i < 5; i++) {
          // i 在for 在整个函数体内都是可见的
          console.log(i);
        }
        // i 对于for循环外的范围是可见的
        console.log(i);
      }
      aFun2();
      aFun1();
    </script>
  </body>
</html>



let 和var 重新声明


var允许在同一作用域中声明同名的变量,而let不可以


例如:let不行


let me  = 'foo';
let me  = 'bar'; //SyntaxError: Identifier 'me' has already been declared



var可以


var me = 'foo';
var me = 'bar'; //这里me被替代了,是可以重复声明的


const


es6中还有一个声明变量的命令const,const和let都是在声明的块作用域中有效,但是let声明的变量可变,值和类型都可以改变,没有限制。const声明额变量不能改变,所以,const一旦声明一个变量,就必须马上初始化,不能留到以后赋值


例如下面语句就会报错


const hehe; //报错,Missing initializer in const declaration


const a = 3;
a = 5; //报错,Uncaught TypeError: Assignment to constant variable.


let 应用场景


let 在块作用域中有效,有的时候,我们为了降低变量污染的风险,在块作用域中使用let来代替var,这样不会污染块作用域的外部作用域,降低 bug率,使代码更安全


作者:程序媛萌小雪Mxx

链接:https://www.jianshu.com/p/9f7f053f7204

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
4月前
|
JavaScript 前端开发 开发者
|
1月前
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
26 5
|
2月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
43 3
|
3月前
|
JavaScript 前端开发
JavaScript let 和 const
JavaScript let 和 const
26 3
|
4月前
|
JavaScript 前端开发
使用 let 将有助于避免 JavaScript 中各种 var 引起的作用域问题。
这段内容介绍了JavaScript编程时的一系列最佳实践,包括使用`===`而非`==`进行比较、以`let`和`const`取代`var`定义变量、始终使用分号、采用合适的命名规范、利用模板字符串拼接、偏好ES6箭头函数、在控制结构中使用大括号、减少代码嵌套、应用默认参数、正确使用`switch`语句中的`break`与`default`分支、避免通配符导入以及简化布尔判断和避免不必要的三元运算符。遵循这些规则有助于提升代码的清晰度和可维护性。
20 2
|
4月前
|
JavaScript 前端开发
|
4月前
|
JavaScript 前端开发
揭秘JavaScript变量的三大守护神:从var到let,再到const,究竟隐藏了哪些秘密?
【8月更文挑战第22天】在JavaScript中,`var`、`let`和`const`用于声明变量,但各有特点。`var`有函数作用域并会被提升至作用域顶部。`let`提供块级作用域且存在暂时性死区,不允许提前访问。`const`同样拥有块级作用域,用于声明常量,一旦初始化便不可改变。现代开发倾向于使用`let`和`const`以获得更清晰的作用域控制和避免潜在错误。
46 0
|
4月前
|
JavaScript
js经典例题之var a = b = c = 9;
js经典例题之var a = b = c = 9;
46 0
|
5月前
|
JavaScript
Js,定义数组的方法,let 数组名 = [数据1,数据2,........,数据n],取值方法,数组名[x],arr[0],let sum sum = sum + arr[0],求和的写法,平均值
Js,定义数组的方法,let 数组名 = [数据1,数据2,........,数据n],取值方法,数组名[x],arr[0],let sum sum = sum + arr[0],求和的写法,平均值
|
5月前
|
JavaScript 前端开发
下一篇
DataWorks