第六章 函数与闭包
6.5 函数是一种对象
函数也是一种对象。它继承与Function对象。
function f (){};
alert(f.constructor)
function Function(){
native code
}
函数的声明与Function对象的生成是等价的。
6.7 嵌套函数声明与闭包
闭包的原理:闭包的前提条件是函数内部声明另一个函数。
function f(){
function g(){
alert("a")
}
g();
}
f();
在js中,函数调用时将隐式的生成call对象,将f函数调用是生成的call对象称为call-f对象。在函数调用完成后,call对象将销毁。
函数f内的函数g的声明将会生成一个与g对应的Function对象,其名称g是call-f对象的属性。离开函数g后,call-g对象将自动销毁。
闭包:
function f(){
var n = 123;
function g () {
alert(n);
}
return g;
}
var g2 = f();
g2();
123
函数f调用时生成的call对象的属性g所引用的Function对象,为g2所引用。只要引用的变量还存在,对象就不会成为垃圾回收的目标。所以g2还在,Function对象就会存在。该Function对象具有call-f对象的引用,所以call-f对象也会存在,所以变量n也存在。
闭包指一种特殊的函数,函数在调用时保持当前的变量名查找的执行环境。