var与let的区别

作者: plainnany | 来源:发表于2017-06-26 13:22 被阅读122次

JavaScript中声明变量通常使用var,ES6中引入了let声明变量,这两者有什么区别呢?

1. 作用域

  1. 通过var定义的变量,作用域是整个封闭函数,是全域的 。
  2. 通过let定义的变量,作用域是在块级或是子块中。
function varTest() {
  var x = 1;
  if (true) {
    var x = 2;  // 同样的变量!
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

function letTest() {
  let x = 1;
  if (true) {
    let x = 2;  // 不同的变量
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

2. 不可以在当前作用域重复声明同一个变量

在同一个函数或同一个作用域中用let重复定义一个变量将引起 TypeError

function letTest() {
  let x = 1;
  let x = 2;  
  console.log(x); 
}

letTest()  //  报错

3. 变量提升

var声明的变量由于存在变量提升(hoist),不论var声明的变量处于当前作用域的第几行,都会提升到作用域的头部。

var a = 1;
function foo(){
  alert( a );   //  undefined 
  var a = 2;
}
foo();

浏览器在运行代码之前会进行预解析,首先解析函数声明,定义变量,解析完之后再对函数、变量进行运行、赋值等。


那么let存在变量提升么?

let是存在变量提升的,在JavaScript中,所有的声明(varfunctionletconstclassfunction\*)都会存在变量提升var声明的变量与let声明的变量区别在于初始化值的不同。

x = y = "global";
(function() {
    x; // undefined
    y; // Reference error: y is not defined

    var x = "local";
    let y = "local";
}());

var 声明的变量会被提升到作用域的顶部并初始化为undefined,而let声明的变量在作用域的顶部未被初始化,直到let声明的语句被赋值,因此当使用这个值的时候会导致一个reference error的错误,在let声明变量之前被称为temporal dead zone,即临时死亡区。

4. letfor循环配合

for(let i = 0; i < 5 ; i++ ){
  setTimeout(function(){
    console.log(i)  // 0 1 2 3 4
  },1000)
}

此时打印出的结果为0 1 2 3 4 ,letfor循环使用时,其作用域是(let i = 0; i < 5 ; i++ ),但是ECMAScript规定,会在{}块级作用域中定义一个let j临时变量与(let i = 0; i < 5 ; i++ )中的i相等,因此setTimeout中的i指向不同的i

for(var i = 0; i < 5 ; i++ ){
  setTimeout(function(){
    console.log(i)  // 5次5
  },1000)
}

而如果换成var之后, 由于i是函数级变量,5个内部函数都指向了同一个i ,而i最后一次赋值是5,因此打印出是5个5。

参考:

  1. Are variables declared with let or const not hoisted in ES6?
  2. let 声明会提升(hoist)吗?
  3. let语句

相关文章

  • 关于ES6的let命令

    1、let的基本用法以及let和var的区别 (1) let与var一样是用来声明变量的,与var的区别是let所...

  • 20190301 es6学习—let和const命令

    let命令 let与var之间的不同 声明变量的作用域 作用:声明变量 类似var与var的区别:var声明的变量...

  • var、let 和 const 区别的实现原理是什么

    问题 var、let 和 const 区别的实现原理是什么? 区别 首先先说下三者的区别 var与let是可以声明...

  • let 和 const;函数默认参数

    let let 和 var 一样, 也是是用来定义变量的。如 let 与 var 的区别 let 定义的变量的作用...

  • let和const

    let/const(常用) let和var 区别 let,const用于声明变量,用来替代老语法的var关键字,与...

  • let 与 var区别

    变量提升,let没有,var有。 重复声明,表现不同 作用域不同

  • var 与 let 区别

    es6 刚流行那会,我只知道 var 即将退出历史舞台,取而代之的是 let 和 const,却不知道 var 有...

  • 重读 ES6(一)

    一、let 和 const 命令 let 命令 let 与 var 的区别:let 声明的变量只在 let 命令所...

  • let与const

    let用法 ES6新增了let命令,用法与var类似,主要用于声明变量,且逐渐代替var,与var的区别为,其声明...

  • var 与 let 的区别

    var var 声明的变量是函数作用域变量。 var 声明的变量提到作用域的前方,简称变量提升。 看一个例子 al...

网友评论

本文标题:var与let的区别

本文链接:https://www.haomeiwen.com/subject/sajrcxtx.html