function testFn() {
var localVar = 10;//对于innerFn函数来说,localVar就属于自由变量。
function innerFn(innerParam) {
alert(innerParam + localVar);
}
return innerFn;
}
闭包的静态作用域:
复制代码 代码如下:
var z = 10;
function foo() {
alert(z);
}
foo(); // 10 – 使用静态和动态作用域的时候
(function () {
var z = 20;
foo(); // 10 – 使用静态作用域, 20 – 使用动态作用域
})();
// 将foo作为参数的时候是一样的
(function (funArg) {
var z = 30;
funArg(); // 10 – 静态作用域, 30 – 动态作用域
})(foo);
理论:因为作用域链,使得所有的函数都是闭包(与函数类型无关: 匿名函数,FE,NFE,FD都是闭包)。从实践角度:以下函数才算是闭包:* 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
* 在代码中引用了自由变量
最后:
ECMAScript是一种面向对象语言,支持基于原型的委托式继承。