//即使外部函数已经返回,当前函数仍然可以引用在外部函数内部引用的变量 function test() { var s1 = "mytest"; function test1(x) { return s1 + x; } return test1; } var ss = new test(); alert(ss(5));//mytest5
js函数值还在内部存储它们可能会引用的定义在其封闭作用域的变量。那些在其所涵盖的作用域内跟踪变量的函数被称为闭包,
上面实例中:test1 就是个闭包,它引用了两个外部变量
总结:函数可以在其作用域内,引用自己作用域内的任何变量,还可以引用外部函数的声明的变量
注意:因为只需要产生一个新值,不需要在局部使用,所以可以不需要给该函数命名
function test2() { var s1 = "mytest"; return function (x) { return s1 + x; } } var ss = new test2(); alert(ss(5));//mytest5
闭包其实存储了外部变量的引用,而不是外部变量的复制品,如果在闭包内部对外部变量值的修改,则外部变量实质值也发生变化
例:
function test() { var s = undefined; return { set: function (a) { s = a; }, get: function () { return s; }, type: function () { return typeof (s);} }; } var test2 = test(); alert(test2.type());//undefined test2.set(5); alert(test2.get());//5 alert(test2.type());//number
这 set ,get,type,共享s变量
总结:1 函数可以引用定义在其外部作用域的变量
2 闭包在其内部存储外部作用域的变量的引用,可以直接操作这些变量
3 闭包比创建它的函数的生命周期更长