JavaScript中的函数:
1.可以作为返回值, 参数或变量的值.
2.可以嵌套定义.
3.函数内部能引用外部变量(嵌套作用域).
这样就存在一个问题, 函数定义时(即实例化Function)的作用域链与函数执行时的作用域链可能不同. 闭包就是用来解决这个问题: 创建函数实际上是将引用环境和函数代码打包成一个可执行实体.
Code:
1.可以作为返回值, 参数或变量的值.
2.可以嵌套定义.
3.函数内部能引用外部变量(嵌套作用域).
这样就存在一个问题, 函数定义时(即实例化Function)的作用域链与函数执行时的作用域链可能不同. 闭包就是用来解决这个问题: 创建函数实际上是将引用环境和函数代码打包成一个可执行实体.
Code:
var
test
=
function
(i){
var funArray = new Array();
for ( var j = 0 ; j < i; j ++ )
{
funArray[j] = function (){
alert(j);
}
}
return funArray;
}
var dummy = test( 3 );
dummy[ 0 ](); // 输出3
dummy[ 1 ](); // 也是输出3
dummy[ 2 ](); // 也是输出3
var funArray = new Array();
for ( var j = 0 ; j < i; j ++ )
{
funArray[j] = function (){
alert(j);
}
}
return funArray;
}
var dummy = test( 3 );
dummy[ 0 ](); // 输出3
dummy[ 1 ](); // 也是输出3
dummy[ 2 ](); // 也是输出3
虽然创建3个(互相独立的)闭包时 j 的值都不同, 但是打包的是同一个上下文, 因此输出是一样的.
Code:
function
test(){
var i = 1 ;
var tmp1 = function (){
alert( ++ i);
}
var tmp2 = function (){
alert( ++ i);
}
tmp1(); // 2
tmp2(); // 3
return [tmp1, tmp2];
}
var arr = test();
arr[ 0 ](); // 4
arr[ 1 ](); // 5
var i = 1 ;
var tmp1 = function (){
alert( ++ i);
}
var tmp2 = function (){
alert( ++ i);
}
tmp1(); // 2
tmp2(); // 3
return [tmp1, tmp2];
}
var arr = test();
arr[ 0 ](); // 4
arr[ 1 ](); // 5
闭包对外部变量的改变能反映到定义时的上下文, 并且能延长上下文中"正常"状况下会消失的作用域的生命期