当function里嵌套function时,内部的function可以访问外部function里的变量。
function
foo(x) {
var tmp = 3 ;
function bar(y) {
alert(x + y + ( ++ tmp));
}
bar( 10 );
}
foo( 2 )
var tmp = 3 ;
function bar(y) {
alert(x + y + ( ++ tmp));
}
bar( 10 );
}
foo( 2 )
不管执行多少次,都会alert 16,因为bar能访问foo的参数x,也能访问foo的变量tmp。
但,这还不是闭包。当你return的是内部function时,才是一个闭包。内部function会close-over外部function的变量直到内部function结束。
function
foo(x) {
var
tmp
=
3
;
return function (y) {
alert(x + y + ( ++ tmp));
}
}
var bar = foo( 2 ); // bar 现在是一个闭包
bar( 10 );
return function (y) {
alert(x + y + ( ++ tmp));
}
}
var bar = foo( 2 ); // bar 现在是一个闭包
bar( 10 );
上面的脚本最终也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar还是能访问x和tmp。
但是,由于tmp仍存在于bar闭包的内部,所以它还是会自加1,而且你每次调用bar时它都会自加1.