1.词法作用域
在说作用域之前,需要说一下词法作用域,词法作用域又叫做静态作用域,即在词法阶段就确定了变量和函数所在的作用域,在编译阶段即确定了作用域。Js使用的就是词法作用域。
来看一个例子:
var a = 20
function fn1(){
console.log(a); // 20
}
function fn2(){
var a = 40
fn1()
}
fn2()
执行函数fn2()
会输出20,因为他会沿着自身的作用域链一直查找,而上层作用域就是全局作用域,这是在编译时就决定了的,而不会去找执行上下文中的40。
2.作用域分类
2.1 全局作用域
当没有声明或者,在非函数作用域中以var
声明,都会有全局的作用域
var a = 123
if (a) {
var b = 456
}
console.log(a) // 123
console.log(b) //456