您的位置:首页 > Web前端 > JavaScript

几个概念:javascript闭包及柯里化

2013-04-27 11:14 387 查看
关于闭包的概念,先来看一段简单的小程序。

var scope = "test";
function clojure(){
var scope = "test1";
function f() {
return scope;
}
return f;
}
clojure()();
他的结果是???

实际上输出的是test1。f是clojure内部的一个function,因为f被外部调用它使得他的“父”function clojure也被链式保留下来,而f内使用的变量实际上会顺着这个链向上找。本例中f顺着链向上找到scope = "test1";试想如果不能在clojure中找到scope,那么就会到全局中继续找scope。这个就是闭包。

或者我们取某个特性来定义闭包,闭包就是函数内能够读取内部变量的函数,或者说函数内返回函数(可能有失偏颇但容易理解)。

大家可能觉得闭包的概念很眼熟,看起来很像类,实例变量,方法。实际上,闭包可以很容易去模拟一个类。

参考:

这篇比较通俗易懂 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

这篇稍微进阶一些 http://coolshell.cn/articles/6731.html

这篇扩展了一下到各种语言的闭包 http://www.ibm.com/developerworks/cn/linux/l-cn-closure/

关于柯里化的概念,实际上是建立在闭包的基础之上的,也来看一段小程序。

var scope = "test";
function currying(welcome){
return function(name) {
return welcome + "," + name;
}
}
var prefix = currying("hello");
prefix("world");
可以看到,实际上输出hello, world是分了两步调用的,第一步只是传入了hello,第二步才传入了world,第一步调用实际上返回的是一个函数,第二步调用才是实际的值。

所以,柯里化其实是把本来要接受n个参数的函数分解为接受n-1个参数函数+1个已固定值。

柯里化的这种便利带来了很多好处,使得他更加灵活,具体例子可以参考第一份文档。

参考:

简单的入门+应用 http://www.yiiyaa.net/1314

一个稍微难一点的问题 http://sjpsega.iteye.com/blog/1700320
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: