一.作用域的概念
是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名冲突。
二.作用域分类(ES6)之前
1.全局作用域
整个script标签或者是一个单独的JS文件。
**2.局部作用域
也称函数作用域,在函数内部就是局部作用域。它只在函数内部起作用。
var num = 10;console.log(num);function fn(){var num = 20;console.log(num);}//案例中变量名都为num,但是分属不同的作用域,所以不会影响程序执行
三.全局变量和局部变量
1.全局变量
在全局作用域下声明的变量,即在函数外部定义的变量。全局变量在代码的任何位置都可以使用。
A 在全局作用域下var声明的变量是全局变量。
var str = "hello";console.log(str);
B 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)。
function fn(){num = 20;//未使用var声明变量也为全局变量}fn();console.log(num);
2.局部变量
在局部作用域下声明的变量,即在函数内部定义的变量。局部变量只能在该函数内部使用。
function fn(){var bol = true;//局部变量console.log(bol);}fn();
3.全局变量和局部变量的区别
A 全局变量:
在任意一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存。
B 局部变量:
只在函数内部使用,当其所在的代码块被执行时,会被初始化;代码块运行结束后,会被销毁,因此更节省空间。
四.作用域链
根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,这种结构称之为作用域链。作用域链采取就近原则。
function f1(){var num = 123;function f2(){console.log(num);}f2();}var num = 456;f1();// 输出结果为123
var a = 1;function fn1(){var a = 2;var b = '22';fn2();function fn2(){var a = 3;fn3();function fn3(){var a = 4;console.log(a);console.log(b);}}}fn1();// 输出结果a为4,b为22
