实例一

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闭包比较相关推荐

  1. JavaScript闭包和this

    目录 JavaScript闭包和this 1 闭包 1.1 变量作用域 1.2 读取函数内部的局部变量 1.3 闭包概念 2 this 2.1 关键点: 2.2 四类调用方式 1)作为对象方法的调用 ...

  2. JavaScript 闭包详解

    2019独角兽企业重金招聘Python工程师标准>>> 闭包是什么? 闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(Function Clo ...

  3. Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  4. JavaScript学习总结(十六)——Javascript闭包(Closure)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.很早就接触过闭包这个概念了,但是一直糊里糊涂的,没有能够弄明白JavaScript的闭包到底是什 ...

  5. Javascript闭包,比较好懂的一篇文章

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  6. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  7. 通过示例学习JavaScript闭包

    译者按: 在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包(Closure)**,这篇博客将提供一些代码示例,帮助大家理解闭包. 原文: JavaScript Closures for Dum ...

  8. 全面理解Javascript闭包和闭包的几种写法及用途

     一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  9. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

最新文章

  1. 《繁凡的论文精读》(一)CVPR 2019 基于决策的高效人脸识别黑盒对抗攻击(清华朱军)
  2. Ubuntu 新装服务器部署流程
  3. Oracle触发器和new、old特殊变量
  4. idea/eclipse下Maven工程集成web服务(tomcat、jetty)
  5. vs程序生成后找不到exe文件
  6. html下拉选择框箭头改为年,CSS自定义select下拉选择框的样式(不用其他标签模拟)...
  7. C/C++编程操作Redis数据库,hiredis包装redis数据库操作接口及测试(增删改查与连接)
  8. ASICFPGA中的三态
  9. HDU 2234 无题I
  10. python入门必备10个坑_python中的基础坑
  11. php pdo setfetchmode,PDOStatement::setFetchMode
  12. Linux之 linux7防火墙基本使用及详解
  13. 统计 假设检验 显著性差异
  14. PyTorch 在 Windows 10 系统下的环境配置及安装
  15. HDCP Key工作原理
  16. Unity UGUI DoTween 学习笔记
  17. Ubuntu16.04设置并查看DNS
  18. 3DMax如何制作弧形椅子?
  19. 《电脑报2014年》更新至第51期
  20. R语言使用贝叶斯层次模型进行空间数据分析

热门文章

  1. Thinking in AJAX(二) —— 基于AJAX的WEB设计
  2. Flutter自定义使用Dialog并更新Dialog中的内容
  3. JavaScript设计模式返璞归真
  4. Mr.J-- jQuery学习笔记(十八)--自定义动画
  5. python3中property使用方法详解
  6. pyhton学习,day1作业,用户名密码登录模块
  7. CSS 选择器优先级
  8. 重做LVM文件系统之减小PV
  9. [MongoDB] MongoDB的基本操作以及文档的增删改查
  10. jquery实现图片滚动效果