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的隶属程序块中)。我们称b为line的环境变量。事实上,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 + 1和y = 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
Python闭包与javascript闭包比较相关推荐
- JavaScript闭包和this
目录 JavaScript闭包和this 1 闭包 1.1 变量作用域 1.2 读取函数内部的局部变量 1.3 闭包概念 2 this 2.1 关键点: 2.2 四类调用方式 1)作为对象方法的调用 ...
- JavaScript 闭包详解
2019独角兽企业重金招聘Python工程师标准>>> 闭包是什么? 闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(Function Clo ...
- Javascript闭包和闭包的几种写法及用途
好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途. 一.什么 ...
- JavaScript学习总结(十六)——Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.很早就接触过闭包这个概念了,但是一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什 ...
- Javascript闭包,比较好懂的一篇文章
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...
- 全面理解Javascript闭包和闭包的几种写法及用途【转】
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...
- 通过示例学习JavaScript闭包
译者按: 在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包(Closure)**,这篇博客将提供一些代码示例,帮助大家理解闭包. 原文: JavaScript Closures for Dum ...
- 全面理解Javascript闭包和闭包的几种写法及用途
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...
- python装饰器与闭包_Python 装饰器和闭包
Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...
最新文章
- 《繁凡的论文精读》(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)
- Ubuntu 新装服务器部署流程
- Oracle触发器和new、old特殊变量
- idea/eclipse下Maven工程集成web服务(tomcat、jetty)
- vs程序生成后找不到exe文件
- html下拉选择框箭头改为年,CSS自定义select下拉选择框的样式(不用其他标签模拟)...
- C/C++编程操作Redis数据库,hiredis包装redis数据库操作接口及测试(增删改查与连接)
- ASICFPGA中的三态
- HDU 2234 无题I
- python入门必备10个坑_python中的基础坑
- php pdo setfetchmode,PDOStatement::setFetchMode
- Linux之 linux7防火墙基本使用及详解
- 统计 假设检验 显著性差异
- PyTorch 在 Windows 10 系统下的环境配置及安装
- HDCP Key工作原理
- Unity UGUI DoTween 学习笔记
- Ubuntu16.04设置并查看DNS
- 3DMax如何制作弧形椅子?
- 《电脑报2014年》更新至第51期
- R语言使用贝叶斯层次模型进行空间数据分析