一.作用域的概念

是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名冲突。


二.作用域分类(ES6)之前

1.全局作用域
整个script标签或者是一个单独的JS文件。
**2.局部作用域
也称函数作用域,在函数内部就是局部作用域。它只在函数内部起作用。

  1. var num = 10;
  2. console.log(num);
  3. function fn(){
  4. var num = 20;
  5. console.log(num);
  6. }
  7. //案例中变量名都为num,但是分属不同的作用域,所以不会影响程序执行

三.全局变量和局部变量

1.全局变量
在全局作用域下声明的变量,即在函数外部定义的变量。全局变量在代码的任何位置都可以使用。

A 在全局作用域下var声明的变量是全局变量。

  1. var str = "hello";
  2. console.log(str);

B 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)。

  1. function fn(){
  2. num = 20;//未使用var声明变量也为全局变量
  3. }
  4. fn();
  5. console.log(num);

2.局部变量
在局部作用域下声明的变量,即在函数内部定义的变量。局部变量只能在该函数内部使用。

  1. function fn(){
  2. var bol = true;//局部变量
  3. console.log(bol);
  4. }
  5. fn();

3.全局变量和局部变量的区别
A 全局变量:
在任意一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存。
B 局部变量:
只在函数内部使用,当其所在的代码块被执行时,会被初始化;代码块运行结束后,会被销毁,因此更节省空间。

四.作用域链

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,这种结构称之为作用域链。作用域链采取就近原则。

  1. function f1(){
  2. var num = 123;
  3. function f2(){
  4. console.log(num);
  5. }
  6. f2();
  7. }
  8. var num = 456;
  9. f1();
  10. // 输出结果为123
  1. var a = 1;
  2. function fn1(){
  3. var a = 2;
  4. var b = '22';
  5. fn2();
  6. function fn2(){
  7. var a = 3;
  8. fn3();
  9. function fn3(){
  10. var a = 4;
  11. console.log(a);
  12. console.log(b);
  13. }
  14. }
  15. }
  16. fn1();
  17. // 输出结果a为4,b为22