闭包、作用域、作用域链、立即执行函数
js运行三部曲:
通篇扫描 语法分析
任何未经声明就赋值的变量和全局变量都归window所有
预编译
预编译发生在函数执行的前一刻
预编译四部曲:函数创建AO 全局创建GO 过程一样
创建AO对象(AO执行期上下文)
找到形参和变量声明,将它们作为AO属性名,值为undefined
将实参和形参统一
在函数体里找函数声明,值赋予函数体
解释执行
作用域、作用域链
[[scope]]指的是作用域,其中储存了运行期上下文的集合。
每个js函数都是一个对象,就有些可以访问有些不能,[[scope]]仅供js引擎存取
作用域链:[[scope]]这个集合呈链式链接,叫作用域链
运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时环境,函数每次执行时对应的执行上下文都是独一无二的,所有多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁。
查找变量: 在哪个函数查找变量就从哪个函数作用域链的顶端依次向下查找。
闭包
当内部函数被保存到外部时,将会生成闭包。
闭包会导致原有作用域链不释放,造成内存泄漏。
function a( ) {
function b( ) {
}
return b
}
var demo = a( );
闭包的作用
实现公有变量
eg:函数累加器
可以做缓存(存储结构)
eg: eater
可以实现封装,属性私有化
eg:Person( );
触发闭包
用立即执行函数解决
模块化开发,防止污染全局变量
命名空间 闭包应用
管理变量,防止污染全局变量,适用于模块化开发。
var init = (function () {
var name = 'abc';
function callName() {
console.log(name);
}
return function () {
callName();
}
}())
init();
立即执行函数
此类函数没有声明,在执行一次后即释放。适合做初始化工作。
(function (形参1, 形参2) {
//....
}(实参1, 实参2))
var num = (function (形参1, 形参2) {
var d = a + b
return d;
}(实参1, 实参2))