let、const、var变量的申明

变量的声明

在Javascript的程序中,使用一个变量之前应当先声明,变量可以通过关键字var、let、const来申明, 否则会报Uncaught ReferenceError 引用错误

在彻底搞明白它们用法之前,需要知道变量的作用域,在目前版本的javascript中存在三种作用域,全局作用域、函数作用域、块级作用域:
全局作用域: 在Javascript代码中的任何地方都是有定义的;
函数作用域: 变量在申明它们的函数体以及这个函数体嵌套的任意函数内都是有定义的
块级作用域:在当前代码块内有效,在申明它们的代码块之外是不可见的

变量提升

var申明的变量存在变量提升,会将变量的申明部分提升至当前作用域的顶部,赋值部分停留原处不动。这意味着变量可以在声明的位置之前使用, 只不过此时的值为未赋值之前的值即undefined

7096513-06b9d0bb49957655.png
申明提前

但是经let、const申明的变量不存在变量提升,它们申明的变量必须在申明之后使用,否则会报引用错误。
7096513-5ecce86441bbfea0.png
7096513-2804988ba562627d.png
申明不提升

暂时性死区

只要在块级作用域内存在let、const申明的变量,那么该变量就绑定了这个区域,不再受外界影响(暂时性死区)
7096513-32c119e1a2574a00.png
暂时性死区

fn函数的函数体就可以看作是一个块级作用域;if的代码块也形成了一个块级作用域,因为if 代码块内的变量a使用let申明,所以变量a就绑定了这个块级作用域,不受外界的影响,不会打印出“local”, 下图使用var 申明的变量就可以取到“local”

7096513-8f98db34907e3193.png

顶层对象的属性

顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。ES5 之中,顶层对象的属性与全局变量是等价的。

window.a = 1;
console.log(a)  // 1

a =2
window.a = 2

顶层对象的属性赋值,跟全局变量的赋值是一回事 等价的。

ES6为了改变这一点,一方面为了保持兼容性,,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。

var a = 1;
window.a  // 1

let b = 1
window.b   // undefined

转载于:https://www.jianshu.com/p/f3f42f663a01

猜你喜欢

转载自blog.csdn.net/weixin_34358092/article/details/91237003