1、简单的描述闭包:如果在函数func内部声明函数inner,然后在函数外部调用inner,这个过程即产生了一个闭包。
(1)闭包是指:有权访问另一个函数作用域中的变量的函数。
创建闭包的方式:在一个函数内部创建另一个函数。
(2)闭包与变量
作用域链引出的一个副作用:闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的变量。
function createFunctions(){
var result = new Array();
for(var i=0; i<10; i++){
result[i] = function(){
return i;
};
}
return result;
}
看似函数应该会会返回一个函数数组,返回0,1,2,,,,实际上,因为每个函数的作用域链中都保存着 createFunction()函数的活动对象,变量的值是10,每个函数内部都是返回10。
我们可以通过创建另一个匿名函数强制让闭包的行为符合预期。
function createFunctions(){
var result = new Array();
for(var i=0; i<10; i++){
result[i] = function(num){
return function(){
return num;
}
}(i); //变量i的当前值复制给参数num,实现返回各个不同的值
}
return result;
}
(3)关于this对象
this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。
闭包会携带包含他的函数的作用域,因此会比起亚函数占用更多的内存,过度的使用闭包可能会导致内存占用过多,故要慎用!
(4)例题
function Foo() {
var i = 0;
return function() {
console.log(i++);
}
}
var f1 = Foo(),
f2 = Foo();
f1();
f1();
f2();
// 0 1 0
闭包的用途:1、访问外部函数的变量。2、使外部函数被引用的变量一直保存在内存中。
这是一个闭包,闭包可以通过作用域链向上访问外层函数的变量和函数,同时闭包的作用域链上引用了外部函数的活动对象。
所以当f1();函数调用结束后,按道理来讲,这里的变量应该被回收,内存应该被释放,但由于外层函数的活动对象被子作用域链引用,
一直保存在内存中,输出结果为0,之后i++ 变为1,当再次调用f1()时,存在于内存中的变量i=1,打印输出,不过变量i还一直存在,除非手动设置为i=null。
2、匿名函数:创建一个函数并将它赋值给变量。
如:var functionName = function(arg0,arg1,arg2){
//函数体
};
3、函数声明----创建函数的一种方式
如:function sayHi(){
alert("Hi!");
}
sayHi();