难点:判断上一级作用域:不是看函数在哪里调用,而是看函数在哪里编写。
function fn (callback) {
var age = 18;
callback();
}
fn(function () {
console.log(age) // age is not defined
})
先看console.log(age)
当前作用域,没有age.
查找上一级作用域,不是fn,而是全局作用域,但是全局作用域也依然没有age,所以打印出来是age is not defined
。
因为匿名函数的函数体写在全局,并没有写在fn里面,它只是被传到fn()的一个参数而已,并没有写在fn内部。
因为这种特点,所以也叫做词法作用域。
总结: 由内而外的找作用域。先看当前作用域有没有,没有则向上一层作用域查找,有的话停止查找,如果还是没有再去找到上一层作用域,直到找到全局作用域为止。
参考资料
- 开课吧4期JS