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

    关于闭包的概念,先来看一段简单的小程序。

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

Javascript闭包——懂不懂由你,反正我是懂了  http://kb.cnblogs.com/page/110782/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值