1.JS的作用域
首先,作用域的概念其实就相当于是一个圈子的概念,有句话说的话,总有一些圈子我们是挤不进去的。换句话说,这个圈子里面的东西我们也是接触不到的。而作用域就可以比喻为圈子。
1.1 作用域类别
在ES5中,作用域只有全局作用域和函数作用域两种,普通的{}代码块仍然属于全局作用域,但是,在ES6中新增了一种块级作用域。
1.2 变量类别
变量的话,主要有全局变量和局部变量两种,主要是看这个变量是在哪里被声明的。
- 全局变量:使用var声明的全局变量会被挂载到window对象上,可以使用window.property访问到
- 局部变量:局部变量存在于函数作用域以及块级作用域中,外部的圈子是访问不到的。
1.3 var 、let 、const的使用场景以及区别
-
var
使用var的话,主要有4种情况:- 在全局作用域中使用var,在任何地方都可以被使用到
- 在函数中使用var声明变量,由于函数作用域可以构成局部作用域,所以此处声明的变量,在其他的地方访问不到。
- 用在循环体里面,循环体里面使用var定义的变量,在全局作用域中仍然 能够被访问到。
- {var a=2},不会构成局部访问,仍然属于全局作用域
-
let 和const
在ES6中,提出了块级作用域的概念:块级作用域的范围仅仅是{}这部分区域。 ES6 可以使用 let、const 关键字来实现块级作用域。注意:let 声明的变量只在 let 变量所在的代码块 {} 内才能被访问到,一旦超出这个范围,就无法被访问
const定义常量与使用let 定义的变量相似:
- 二者都是块级作用域
- 都不能和它所在作用域内的其他变量或函数拥有相同的名称
但是,也存在不同:
- const声明的常量必须初始化,而let声明的变量不用
- const 定义常量的值不能通过再赋值修改,也不能再次声明。 而 let 定义的变量值可以修改。