第七章 函数表达式
- 定义函数的两种方式
- 函数声明
- 函数声明提升:在执行代码前会先读取函数声明
- 函数表达式
- 创建一个函数并赋值给变量,创建的叫匿名函数(拉姆达函数)
- 函数声明
递归
- arguments.callee:指向正在执行的函数的指针,用他代替函数名,防止执行时函数的值已经被修改
闭包
- 闭包:指有权访问另一个函数作用域中的变量的函数
- 创建闭包的常见方式是,在一个函数 A 内部创建另一个函数 B,称 A 为包含函数,B 为内部函数
function A(p1) { return function(p2) { // 匿名函数 B return p1 + p2; }; }
- 在 B 从 A 中被返回后,它的作用域链为 A 的活动对象和全局变量对象,这样 B 就可以访问在 A 中定义的所有变量。且 A 在执行完毕后,其活动对象不会被销毁,因为 B 的作用域链仍然在引用这个活动对象
- 闭包与变量
- 当返回的是多个函数(如函数数组),他们共同保存着 A 中的活动对象,引用的是同一个地址,即产生了 闭包只能取得包含函数中任何变量的最后一个值 的副作用
- 闭包内访问 this、arguments 对象时,只能访问自己的活动对象,不能直接访问外部函数的 this、arguments
- 如果闭包的作用域链中保存着一个 HTML 元素,那么就意味着该元素将无法被销毁,在 IE 的某些版本下会导致存在内存泄漏的问题。因此,在使用完后记得在外部函数中将 element 变量设为 null,以解除对 DOM 对象的引用
模仿块级作用域
- 多次声明变量时,只有第一次声明有效,但是会执行后续声明中的变量初始化
- 块级作用域(私有作用域)的匿名函数
(function(){
//这里是块级作用域
})();
私有变量
- 任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问这些变量。私有变量包括函数的参数、局部变量和在函数内部定义的其他函数
- 特权方法:有权访问私有变量和私有函数的公有方法
- 静态私有变量
- 构造函数初始化(未声明),会被看做全局变量
- 特权方法在原型上创建
- 所有实例共享私有变量和函数
- 模块模式
- 用于单例
- 用一个匿名函数返回对象(对象字面量的形式)
- 增强的模块模式
- 使返回的对象必须是某对象的实例