一.作用域的概念
是代码名字(变量)在某个范围内起作用和效果,目的是为了提高程序的可靠性,更重要的是减少命名冲突。
二.作用域分类(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