var、let、const
1、变量声明与赋值
方式 | 描述 |
---|---|
var 声明的变量 | 可以重新声明和重新分配 |
let 声明的变量 | 不可以重新声明和但可以重新分配 |
const声明的变量 | 不能重新声明也不能重新分配 |
PS:没有使用var,let,const声明的变量,都属于全局变量
2、var作用域——全局、函数
var声明的变量是函数作用域或者是全局作用域
当var声明的变量是全局变量时,他会在window上面创建一个同名的全局属性
当在函数内部用var声明变量时,该变量的作用域为该函数
3、let作用域——块(script、函数、循环)
用let声明的变量是全局变量时,不会在window上创建一个同名的全局属性
在函数内部用let声明的变量时,作用域为该函数,通俗的说局部变量(这一点跟var一样)
在块里面用let声明的变量,其作用域为该块作用域,而var声明的变量则不受块作用域影响
PS:一个函数相当于一个块(局部),script标签包裹的内容也相当于块(全局)let声明的全局变量属于全局作用域scope的script
4、const作用域——块(script、函数、循环)
用const声明的变量是全局变量时,不会在window上创建一个同名的全局属性
在函数内部用const声明变量时,作用域为该函数,通俗的说局部变量(这一点同var,let)
在块里面用const声明的变量,其作用域为该块作用域
参考博客:https://zhuanlan.zhihu.com/p/31444950
5、区别
变量声明、重新分配、初始化、变量提升
var 声明的变量是可以重新声明和重新分配,支持变量提升,声明时可以不初始化
let 声明的变量是不可重新声明和但可以重新分配,不支持变量提升,声明时可不初始化
const声明的变量不能重新声明也不能重新分配,不支持变量提升,声明时必须初始化
变量的作用域
var:全局作用域和函数作用域,全局变量具有全局作用域,局部变量具有局部作用域
let:只有块级作用域,let和const声明的变量具有块级作用域
js只支持全局作用域和函数作用域,不支持块作用域,因此使用let、const支持块作用域
参考:https://www.cnblogs.com/xjt31/p/13990721.html
PS:其实let、const的变量提升了,但只是不能使用,事实上,当 JS 引擎检视下面的代码块有变量声明时,对于 var 声明的变量,会将声明提升到函数或全局作用域的顶部,而对 let 或 const 的时候会将声明放在暂时性死区内。任何在暂时性死区内访问变量的企图都会导致“运行时”错误(runtime error)。只有执行到变量的声明语句时,该变量才会从暂时性死区内被移除并可以安全使用。
PS:全局对象是最顶层的对象,在浏览器环境下指的是window对象,在node指的是global对象。ES5中,全局对象的属性和全局变量是等价的。未使用var let const声明的变量,自动成为全局对象window的属性,这被认为是js的最大败笔。ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是全局对象的属性,另一方面规定,let,const,class命令声明的全局变量不属于全局对象的属性。也就是说,从ES6开始,全局变量将逐渐与全局对象的属性脱钩。
delete用来删除js对象的属性,不能删除任何变量(全局、局部、原型链中的变量)