要成為高級 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(英文)
為之漫筆 翻譯的ECMA 262 Closure
??
?