变量的声明
在Javascript的程序中,使用一个变量之前应当先声明,变量可以通过关键字var、let、const来申明, 否则会报Uncaught ReferenceError 引用错误
在彻底搞明白它们用法之前,需要知道变量的作用域,在目前版本的javascript中存在三种作用域,全局作用域、函数作用域、块级作用域:
全局作用域: 在Javascript代码中的任何地方都是有定义的;
函数作用域: 变量在申明它们的函数体以及这个函数体嵌套的任意函数内都是有定义的
块级作用域:在当前代码块内有效,在申明它们的代码块之外是不可见的
变量提升
经var申明的变量存在变量提升,会将变量的申明部分提升至当前作用域的顶部,赋值部分停留原处不动。这意味着变量可以在声明的位置之前使用, 只不过此时的值为未赋值之前的值即undefined
暂时性死区
只要在块级作用域内存在let、const申明的变量,那么该变量就绑定了这个区域,不再受外界影响(暂时性死区)fn函数的函数体就可以看作是一个块级作用域;if的代码块也形成了一个块级作用域,因为if 代码块内的变量a使用let申明,所以变量a就绑定了这个块级作用域,不受外界的影响,不会打印出“local”, 下图使用var 申明的变量就可以取到“local”
顶层对象的属性
顶层对象,在浏览器环境指的是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