Board logo

标题: 闭包的概念、形式与应用(2)形式 [打印本页]

作者: look_w    时间: 2018-5-23 16:15     标题: 闭包的概念、形式与应用(2)形式

闭包的表现形式虽然建立在相似的思想之上,各种语言所实现的闭包却有着不同的表现形式,下面我们来看一下闭包在一些常用语言中的表现形式。
JavaScript 中的闭包JavaScript(ECMAScript)不是通用编程语言,但却拥有较大的用户群体,而 Ajax 的流行也使更多的人关注 JavaScript。虽然在进行 DOM 操作时容易引发循环引用问题,但 JavaScript 语言本身对闭包的支持还是很好的,下面是一个简单的例子:
清单 4. JavaScript
1
2
3
4
5
6
7
8
9
function addx(x) {
return function(y) {return x+y;};
}

add8 = addx(8);
add9 = addx(9);

alert(add8(100));
alert(add9(100));




Ruby 中的闭包随着 Ruby on Rails 的走红,Ruby 无疑是时下炙手可热的语言之一,Ruby 吸取了很多其他语言的优点,是非常优秀的语言,从这一点来看,很难说清是 Rails 成就了 Ruby 还是 Ruby 成就了 Rails。
Ruby 使用 Block 来定义闭包,Block 在 Ruby 中十分重要,几乎到处都可以看到它的身影,下面的代码就展示了一个 Block:
清单 5. Ruby
1
2
3
sum = 0
10.times{|n| sum += n}
print sum




10.times 表示调用对象10的 times 方法(),紧跟在这个调用后面的大括号里面的部分就是Block。所谓 Block 是指紧跟在函数调用之后用大括号或 do/end 括起来的代码,Block 的开始部分(左大括号或 do)必须和函数调用在同一行。Block 也可以接受参数,参数列表必须用两个竖杠括起来放在最前面。Block 会被作为它前面的函数调用的参数,而在这个函数中可以使用关键字 yield 来调用该 Block。在这个例子中,10.times 会以数字0到9为参数调用 Block  10次。
Block 实际上就是匿名函数,它可以被调用,可以捕获上下文。由于语法上要求 Block 必须出现在函数调用的后面,所以 Block 不能直接作为函数的的返回值。要想从一个函数中返回 Block,必须使用 proc 或 lambda 函数把 Block 转化为对象才行。详细内容请参考和。
Python 中的闭包Python 因其简单易学、功能强大而拥有很多拥护者,很多企业和组织在使用这种语言。Python 使用缩进来区分作用域的做法也十分有特点。下面是一个 Python 的例子:
清单 6. Python 1
1
2
3
4
5
6
7
8
9
def addx(x):
def adder (y): return x + y
return adder

add8 = addx(8)
add9 = addx(9)

print add8(100)
print add9(100)




在 Python 中使用 def 来定义函数时,是必须有名字的,要想使用匿名函数,则需要使用lambda 语句,象下面的代码这样:
清单 7. Python 2
1
2
3
4
5
6
7
8
def addx(x):
return lambda y: x + y

add8 = addx(8)
add9 = addx(9)

print add8(100)
print add9(100)




Python 简单易用且功能强大,关于 Python 的更多信息请参考。
Perl 中的闭包Perl 是老牌文本处理语言了,在 WEB 开发方面也有一席之地。不过 Perl6 的开发进行比较慢,也许一些用户开始转投其它语言了。下面是一个 Perl 的例子。
清单 8. Perl
1
2
3
4
5
6
7
8
9
10
sub addx {
my $x = shift;
return sub { shift() + $x };
}

$add8 = addx(8);
$add9 = addx(9);

print $add8->(100);
print $add9->(100);




Lua 中的闭包Lua 以其小巧和快速的特点受到游戏开发者的青睐,被一些游戏用来定制 UI 或作为插件语言,如果你玩过《魔兽世界》,那你对 Lua 一定不会感到陌生。前面在说明闭包原理时就使用了 Lua,这里就不再给出其他的例子了。更多的内容请参考。
Scheme 中的闭包Scheme 是 Lisp 的一种方言,被 MIT 用作教学语言。Scheme 属于函数语言,虽然不像命令语言那么流行,却是很多黑客喜欢的语言。很多编程思想起源于函数语言,闭包就是其中之一。一般认为 Scheme 是第一个提供完整闭包支持的语言。下面是一个 Scheme 的例子:
清单 9. Scheme
1
2
3
4
5
6
7
8
(define (addx x)
(lambda (y) (+ y x)))

(define add8 (addx 8))
(define add9 (addx 9))

(add8 100)
(add9 100)




Scheme 的语法非常简单,只是有人觉得写法看起来比较古怪。有关 Scheme 更多信息请参。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0