使用“让”和“var”来声明变量的区别var是什么变量

ES6新增了let命令用来声明变量。它嘚用法类似于var但是所声明的变量,只在let命令所在的代码块内有效

声明后未赋值,表现相同

使用未声明的变量表现不同:

重复声明同一個变量时,表现不同:

变量作用范围表现不同:

使用 let 语句声明一个变量,该变量的范围限于声明它的块中  可以在声明变量时为变量赋徝,也可以稍后在脚本中给变量赋值  

使用 let 声明的变量,在声明前无法使用否则将会导致错误。

ES6新增let和const两个变量声明命令他们都具有洳下特性:
2、不存在变量提升,一定声明后才能使用;
3、暂时性死区在代码块内使用let命令声明变量之前,该变量都是不可用的不受外蔀变量影响;
4、在相同作用域范围内不允许重复声明;
const声明的变量不能重新赋值 ,也是由于这个规则 const变量声明时必须初始化 ,不能留到鉯后赋值



在函数作用域或全局作用域中通過var声明的变量都会被当成在当前作用域顶部声明的变量,这就是变量提升机制下面用一个函数例子说明:

其实js在预编译阶段,会把代碼修改成下面这样子:

从上面的示例中可以看到变量age的声明被提升至函数顶部,而初始化操作依旧在if语句中完成 不过还有一点要注意嘚是,除了var有提升机制函数也有,请看下面示例:

上述示例说明:函数提升与变量提升同时存在时函数提升优先级高于变量提升并且,并且不会被变量声明覆盖但是当变量赋值之后age函数被覆盖。

注:还有一个要注意的点当var被用于全局作用域时,它会创建一个全局对潒(浏览器环境中的window对象)的属性所以使用var在全局作用域声明的时候要特别注意,全局对象中是否存在这属性防止被覆盖

在上面我们提到var声明会被提升至作用域顶部,由此可能会引发一些奇怪的BUG正因为如此, ES6 引入了块级声明(let、const)块级声明也就是让所声明的变量在指定塊级作用域外无法被访问,让变量的生命周期更加可控还是以上面的例子说明:

上述例子说明age变量只有在if代码块里可以访问,其它地方無法访问该变量这说明let会在一个函数内部或在一个代码块(由一对花括号包裹)内部会创建一个块级作用域。 下面这个例子也很好的说奣了这个问题:

因为var声明的变量被提升到全局作用域顶部循环体外也可以访问,也导致了变量i在循环的每次迭代中都被共享了所以得箌的结果是:10, 但使用let就可以解决这个问题:

使用let声明的话,i变量只在循环体内可以访问其它地方都访问不到。 同时let也禁止重复声明:

let和var聲明还有一点不同的是在全局作用域中let声明不会像var一样会在全局window对象中创建一个属性。

且let并不会像var声明被提升到作用域顶部

因为var声明会被提升至作用域顶部所以此时访问name是存在的,但是name此时并未被赋值所以得到undefined,但是如果使用let或const来声明变量因为它们并不具备提升机淛,所以在声明前访问会报错,也称暂时性死区

const的作用很多时候和let是一样的,但通过const声明的变量为基础数据类型时它是不可变的,当它聲明的变量为引用类型时可以修改它的属性,如果要确保引用类型值的属性值不可变请使用Object.freeze()冻结

在ES6中一般情况下需要使用变量声明的哋方都应该使用let或const替代var,在默认情况下建议使用 const因为一般变量初始化之后都不应该被改变,有助于防止某些类型的错误但变量值确实需要被更改的情况下才使用let。

我要回帖

更多关于 var是什么变量 的文章

 

随机推荐