作用域
管理引擎如何在当前作用域及其子作用域中根据标识符名称进行变量查找
标识符即变量名,函数名
JavaScript中只有全局作用域和函数作用域
JavaScript代码执行过程两个阶段,代码编译和代码执行。
编译阶段:编译器执行,将代码翻译成可执行代码,确定作用域
执行阶段:由引擎完成,执行可执行代码,执行上下文此阶段创建(执行上下文创建,代码执行,垃圾回收)
作用域链
由当前环境和上层环境的一系列变量对象组成,保证当前执行环境对符合访问权限的变量和函数的有序访问。
执行上下文执行阶段,活动对象单向通道访问。
闭包
闭包是一种特殊的对象
- 由执行上下文 A 和执行上下文中创建的函数 B 组成
- B 执行时访问了 A 变量对象中的值,产生闭包(B 函数必须被执行)
- 多数以函数 B 名称代指闭包,chrome中以执行上下文 A 的函数代指闭包。
1 | var fn = null; |
fn函数在bar()内部执行时,可以访问通过赋值保留的innerFoo引用,可以访问foo的被保留变量对象。
通过闭包,可以在其他的执行上下文中,访问到函数的内部变量
如下例,尽管闭包被保存在全局变量中,闭包的作用域链不会发生改变。
1 | var fn = null; |
闭包应用场景
柯里化
模块
- 利用函数自执行创建一个模块,add为模块向外暴露的方法,a,b为私有变量。
1
2
3
4
5
6
7
8
9
10
11(function () {
var a = 10;
var b = 20;
function add(num1, num2) {
var num1 = !!num1 ? num1 : a;
var num2 = !!num2 ? num2 : b;
return num1 + num2;
}
window.add = add;
})();
add(10, 20);
参考文章:
作用域链与闭包–这波能反杀
如有错误,烦请指正,谢谢!