Python闭包与javascript闭包比较

实例一

python

def line_conf():

def line(x):

return 2*x+1

print(line(5)) # within the scope

 

 

line_conf()

print(line(5)) # out of the scope

运行结果如下

Line函数是未定义的因为它是嵌套函数

我们再来看看javascript代码

结果是一样的,甚至连错误信息都一样

下面我们再来

 

 

 

实例二

结果也是一样的

实例三

如果line()的定义中引用了外部的变量,会发生什么呢?

我们可以看到,line定义的隶属程序块中引用了高层级的变量b,但b信息存在于line的定义之外 (b的定义并不在line的隶属程序块中)。我们称bline环境变量。事实上,line作为line_conf的返回值时,line中已经包括b的取值(尽管b并不隶属于line)

上面的代码将打印25,也就是说,line所参照的b值是函数对象定义时可供参考的b,而不是使用时的b值。

而js的表现又是如何呢

结果又是一样啊

一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象。环境变量取值被保存在函数对象的__closure__属性中。比如下面的代码:

__closure__里包含了一个元组(tuple)。这个元组中的每个元素是cell类型的对象。我们看到第一个cell包含的就是整数15,也就是我们创建闭包时的环境变量b的取值。

看看js 也有这个变量

 

 

 

实例四

这个例子中,函数line与环境变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个环境变量的取值,这样,我们就确定了函数的最终形式(y = x + 1y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用

 

实例五

这是因为在执行代码 c = foo()时,python会导入全部的闭包函数体bar()来分析其的局部变量,python规则指定所有在赋值语句左面的变量都是局部变量,则在闭包bar()中,变量a在赋值符号"="的左面,被python认为是bar()中的局部变量。再接下来执行print c()时,程序运行至a = a + 1时,因为先前已经把a归为bar()中的局部变量,所以python会在bar()中去找在赋值语句右面的a的值,结果找不到,就会报错

我们来看看js又是如何

Js是没有保错的,但只要我们改一个东西就会立即报错

我们在bar里面加一个var,声明a为局部变量

看看结果,我们加了个断点

未执行的时候,a已经为undefined啦,那就可以说明a不是引入出面的a啦

我们我们来运行一下

呵呵,a变成了nan啦,为什么呢

原因是这个

这个时候就跟上面的python情况一模一样啦,而且现在没有构成闭包

 

实例六

跟我们预算的不一样啊,我们会以为2,3,4

我们来看看js

情况也一样

而这个形式并没有构成闭包,只是单纯的引用了全局变量而已

下一篇将分析原理篇,从python源码去解释函数是怎样运行的

 

 

 

转载于:https://www.cnblogs.com/simonlu/p/3620558.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值