首先我们来看一段代码
console.log(变量)// undefinedvar变量 =1复制代码
从上面的代码来看,虽然变量还没有被声明,但是我们却可以使用,这种情况就叫做提升,并且是声明提升。
再来一段代码
console.log(变量)// ƒ 变量() {}function变量(){}var变量 =1复制代码
上面的代码叫做函数提升,函数提升跟变量提升差不多,就是函数提升优先级比变量高。
从上可知,使用 var 声明的变量会被提升到作用域的顶部。
区别
首先我们再来看一段代码
vara =1letb =1constc =1console.log(window.b)// undefinedconsole.log(window.c)// undefinedfunctiontest(){console.log(a)leta}test()复制代码
首先在全局作用域下使用 let 和 const 声明变量,变量并不会被挂载到 window 上,这一点就和 var 声明有了区别。
再者当我们在声明 a 之前如果使用了 a ,就会出现报错的情况。
首先报错的原因是因为存在暂时性死区,我们不能在声明前就使用变量,这也是 let 和 const优于 var 的一点。然后这里你认为的提升和 var 的提升是有区别的,虽然变量在编译的环节中被告知在这块作用域中可以访问,但是访问是受限制的。
let、const、var 创建的不同
let 和 const 声明定义了作用于 正在运行的执行上下文(running execution context) 的 词法环境(LexicalEnvironment) 的变量。
let 和 const 声明的变量是在词法环境实例化时创建的,但是给变量赋值的原生功能 LexicalBinding 以及变量初始化的功能 Initializer 是在之后执行的,而不是在创建变量时,所以在执行之前无法以任何方式访问它们,这就是 暂时性死区 。
var语句声明了作用于 正在运行的执行上下文(running execution context) 的 变量环境(VariableEnvironment) 的变量。
var 声明的变量同样是在词法环境实例化时创建的,并且创建时就赋值有 undefined ,在任何的 变量环境(VariableEnvironment) 中, var 变量 的绑定可以出现多个,但是最终值是由 赋值时确定的,而不是创建变量时。
总结: let const 跟 var 不同的原因是 let const 的创建是基于词法环境,而 var 是基于变量环境。。用通俗的话来说就是,不是同一个系统的...
网友评论