Easyjs 细说Javascript里的 闭包(Closure)
要成为高级 JavaScript 程序员,就必须理解闭包。闭包有时你非用她不可, 所有理解闭包还是必要的。笔者通过例子来说一下“闭包”
1.定义一个函数的代理:
function delegate (fn, scope, args, append) {
return function /*匿名函数1*/ () {
var callargs = Array.proptotype.slice(arguments, 0);
if (append)
callargs = callargs .concat(args);
fn.apply(scope || window, callargs );
}
}
return function /*匿名函数1*/ () {
var callargs = Array.proptotype.slice(arguments, 0);
if (append)
callargs = callargs .concat(args);
fn.apply(scope || window, callargs );
}
}
在上面这段代码中就用到了闭包,即delegate方法里return 后面的函数(匿名函数1)就是闭包, 这个例子是个方法fn创建一个代理, 意思就是在执行方法fn的时候给他添加一些额外的参数或者改变fn执行的作用域,比如:
function test_delegate() {
var fn = delegate(test, window, ["11122", "aaaa"], true); //给方法test 创建一个代理, 并传人参数["11122", "aaaa"]
fn("111"); //调用test的代理
}
function test() { //输出test的所有参数
var arr =[];
Easy.each(arguments, function (item) {
arr.push(item);
});
alert(arr.join("\n"));
}
var fn = delegate(test, window, ["11122", "aaaa"], true); //给方法test 创建一个代理, 并传人参数["11122", "aaaa"]
fn("111"); //调用test的代理
}
function test() { //输出test的所有参数
var arr =[];
Easy.each(arguments, function (item) {
arr.push(item);
});
alert(arr.join("\n"));
}
111
11122
aaaa
delegate方法出自Easy.js。下面粘贴一个ECMA 262 里对闭包的介绍
ECMA 262 Closure(英文)