作用域是可访问的变量的集合。在JavaScript中,作用域为可访问变量,对象,函数的集合,它分为局部作用域和全局作用域。作用域决定了这些变量的可访问性(可见性)。
1. 全局作用域(Global Scope)
在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:
(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域.
- var outValue = "最外层变量"; //最外层变量
- function outFun() { //最外层函数
- var inValue = "内层变量";
- function innerFun() { //内层函数
- console.log(inValue );
- }
- innerFun();
- }
- console.log(outValue ); //最外层变量
- outFun(); //最外层函数
- console.log(inValue ); //inValue is not defined 内层变量是局部作用域,函数以外访问不到他
- innerFun(); //innerFun is not defined 内层函数是局部作用域,函数以外访问不到他
(2)所有末定义直接赋值的变量自动声明为拥有全局作用域
- function outFun2() {
- value1= "未定义直接赋值的变量";
- var value2= "内层变量2";
- }
- outFun2();//要先执行这个函数,
- console.log(value1); //未定义直接赋值的变量
- console.log(value2); //value2not defined 内层变量2是局部作用域,函数以外访问不到他
注意点:如果在函数中定义变量时,如果不添加var关键字, 这个变量是一个全局变量
- function test() {
- // 开发时千万不要这么写
- num = 123;
- console.log(num);
- }
- test();
- console.log(num);
(3)所有window对象的属性拥有全局作用域
2. 局部作用域(Local Scope)
和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域
3. 块级作用域
ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6 的到来,为我们提供了‘块级作用域’,可通过新增命令 let 和 const 来体现。
块级作用域所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
在一个函数内部,在一个代码块(由一对花括号包裹)内部