一、用let声明的变量不会提升
用let声明的变量是不会提升的。
这种变量提升机制在开发时会给我们造成很多的困扰,ecmascript 6引入了let声明,用法与var相同,不过用let声明的变量不会被提升,可以把变量的作用域限制在当前代码块中。
使用let声明变量,还可以防止变量的重复声明。例如在某个作用域下已经存在某个标识符,此时再使用let关键字声明它,就会抛出错误。同一作用域下,不能使用let重复定义已经存在的标识符,但如果在不同的作用域下,则是可以的。
let简介
let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。下面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。因为变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
以上内容参考自百度百科-ecmascript 6
二、var、function、let、const变量提升
我是从这两篇文章的阅读中,做出了自己的总结,如果不明白的话可以看看这两篇文章:
变量提升情况:
变量提升概念:
js引擎在执行过程中变量的生命周期分为三个阶段: 注册、初始化、赋值
var、funciton、let、const的生命周期:
var 在注册阶段初始化是一起的,会被赋值为 undefined ,所以变量提升,打印出的是 undefined
function 在注册阶段初始化、执行都一起了,所以函数不管写在哪里都可以直接调用
let 在注册阶段和初始化是解耦的,只是创建了但是并未初始化,所以出现了暂时性死区,打印出的是 'x is not defined'
const 的生命周期与let一样,只不过没有赋值阶段
三、js中let和var定义变量的区别
1、区别:
var定义的变量是全局变量或者函数变量。
let定义的变量是块级的变量。