最近看了一本叫《JavaScript设计模式与开发实践》的书,这本书在讲JavaScript实现的设计模式之前先讲了了JavaScript的闭包和高阶函数的知识,感觉十分受用。
闭包的概念很难懂,自己以前的理解就是可以在外部访问函数内部的局部变量。通过几个例子加深理解:
var func = function () {
var a = 1;
console.log(a++);
}
func(); //输出1
func(); //输出1
每次执行完一次func,局部变量都会被销毁。
使用闭包:
var func = function () {
var a=1;
return function (){
a++;
console.log(a);
};
}
f = func();
f(); //2
f(); //3
f(); //4
f(); //5
每次调用f()之后,变量a并没有消失。
闭包的应用:
1、封装变量:
有求连乘函数如下:
var mult = function () {
var a=1;
for(var i=0,l=arguments.length;i<l;i++){
a = a*arguments[i];
}
return a;
}
可以用闭包将其改为性能更加好的形式:
var mult = (function () {
var cache = {};
var cal = function () {
var a=1;
for(var i=0,l=arguments.length;i<l;i++){
a = a*arguments[i];
}
return a;
}
return function () {
var args = Array.prototype.join.call(arguments,',');
if (args in cache) {
return cache[args];
}
return cache[args] = cal.apply(null,arguments);
//why not 'call(arguments)': because it is only one parameter: [arguments].
}
})();
console.log(mult(1,2,3)); //输出6