`
yiminghe
  • 浏览: 1460295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Javascript闭包与python 闭包

阅读更多

下列代码很好的展示了javscript函数的闭包,javascript没有块作用域,只有函数作用域

 

var f=[];
for(var i=0;i<10;i++)
f.push(function(){alert(i);});

f[0]();

 

打印 10。因为所有f函数都共享同一个作用域window,调用时查找的是同一个window的i,即循环结束后的i

 

解决方法很多,其中之一是 i 复制到函数最底层作用域中。

 

var f=[];
for(var i=0;i<10;i++)
f.push(function(i){return function(){alert(i);}}(i));
//或者 更直接,手动copy i 到 自己的作用域
//f.push(function(){var t=i;return function(){alert(t);}}());
f[0]();

 

据某人说:perl python 刚开始的表示就可以输出0,且有块作用域,我觉得 javascript 更合理啊,按照perl python 的做法,岂不是定义函数时把函数里用到的外部变量全部给自己做copy ???


不懂perl,python,是真的这样么

 

PS:后记:

 

python 没有块作用域,只有模块,类,函数作用域,上述javascript的等价python代码:

 

fs=[]
i=0
while i<10:
   
    def t():
        print i,"!"
    fs.append(t)
    i=i+1
    
fs[0]()

#作用域相关证明
print t
print fs[0]
print fs[9]
 

输出10,和javascipt表现一致!

 

参考 :

 

JavaScript对象模型-执行模型

 

python闭包

分享到:
评论
2 楼 phyeas 2009-04-25  
第二段代码直译过来应该是:
f=[]
for i in range(10):
    def p(i):
        return lambda:print(i)
    f.append(p(i))
f[0]()

-------------
PS:以上代码均未经测试
1 楼 phyeas 2009-04-25  
第一段代码直译过来应该是这样:
f=[]
for i in range(10):
    f.append(lambda:print(i))
f[0]()

这样打印出来的值是i最后的值,(即9)

相关推荐

    【JavaScript源代码】详解JavaScript闭包问题.docx

    详解JavaScript闭包问题  闭包是纯函数式编程语言的传统特性之一。通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流JavaScript库...

    Python、Javascript中的闭包比较

    同为脚本语言,python和Javascript具有相似的变量作用域,不像php,...那么这样说,python的闭包应该很简单了,像javascript一样,我们编写类似的代码: def func1(): a = 1 def func2(): a = a + 1 return a retu

    廖雪峰 Git Javascript Python 3 Python 2.7 教程合集 PDF/EPUB

    《廖雪峰 Git Javascript Python 3 Python 2.7 教程合集》是一份全面且深入的编程学习资源,涵盖了现代软件开发中至关重要的三种技术:Git版本控制工具、JavaScript编程语言以及Python编程语言(包括Python 3和...

    Python闭包函数定义与用法分析

    闭包在很多语言中都有应用,比如Python、JavaScript等。 闭包函数的定义:在Python中,闭包是由一个外部函数和一个内部函数组成的,内部函数引用了外部函数的局部变量,即使外部函数已经执行完毕,这些变量仍然可以...

    廖雪峰javascript,python和git教程

    廖雪峰是知名的IT教育工作者,提供了丰富的在线课程,涵盖了编程语言JavaScript、Python和版本控制系统Git的教程。下面是根据提供的文件信息,对这些教程内容的详细知识点梳理。 ### JavaScript教程 #### ...

    关于javascript、Python100道题

    2. **控制结构**:与 JavaScript 类似,Python 也有 `if...else`、`for` 和 `while` 循环。 3. **函数**:Python 函数用 `def` 关键字定义,支持默认参数、可变参数和关键字参数。 4. **类与对象**:Python 是面向...

    廖雪峰 JavaScript Python Git 教程

    JavaScript教程将涵盖基础语法、对象、函数、闭包、异步操作等内容,帮助初学者掌握JavaScript的核心概念。Python教程会讲解变量、数据类型、控制流、函数、类等基础知识,以及进阶话题如装饰器、生成器和元类。Git...

    浅谈JavaScript闭包

    上面那句话听起来可能不是很理解,本人在之前写过一篇Python 闭包小记》的关于 Python 闭包的一些知识的文章,里面写了百度百科对于闭包的理解,虽然由于才疏学浅大部分都是引用的他人的知识架构,但语言这种东西都...

    closure闭包

    在Java中,你可以使用Lambda表达式或匿名内部类来创建闭包,而在JavaScript中,所有的函数都是闭包。在C#中,可以使用`Action`、`Func`等委托类型或`lambda`表达式来创建闭包。 总的来说,闭包在编程中扮演着至关...

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    ### JavaScript闭包与垃圾回收机制详解 #### 一、闭包 ##### 1.1 闭包是什么? 闭包(Closure)是JavaScript中一个非常重要的概念,它涉及到函数及其相关的词法作用域。简单来说,闭包就是能够访问其自身作用域...

    廖雪峰 JavaScript Python Git 教程-01151355.pdf

    ### 廖雪峰 JavaScript Python Git 教程 #### JavaScript 教程概览 ##### JavaScript 简介 - **用途**: JavaScript 是一种轻量级的脚本语言,主要用于网页的交互控制。 - **特点**: 动态类型、弱类型、基于原型。 ...

    廖雪峰教程合集(JavaScript+Python+git)高清带目录

    3. **作用域与闭包**:解释了JavaScript中的作用域规则以及闭包机制,这是理解和解决内存管理问题的关键。 4. **异步编程**:介绍了事件循环、回调函数、Promise以及async/await等处理异步操作的方法。 5. **DOM...

    廖雪峰JavaScript+廖雪峰python3【PDF】

    2. **函数**:定义函数、参数传递、匿名函数、箭头函数、函数作用域与闭包。 3. **对象和数组**:对象字面量、原型链、构造函数、数组方法(如map、filter、reduce等)。 4. **DOM操作**:选取元素、添加删除元素...

    【JavaScript源代码】JS难点同步异步和作用域与闭包及原型和原型链详解.docx

    JavaScript是Web开发中的核心语言,其重要特性包括同步与异步处理、作用域与闭包、以及原型和原型链。这些概念是理解JS高级特性的基石。 **同步与异步的区别** 在JavaScript中,同步执行意味着代码按照顺序依次运行...

    pyv8-source-linux-windows-32-64-python2-python3

    《PyV8:跨越平台与Python版本的JavaScript引擎解析》 PyV8是Python与V8 JavaScript引擎交互的桥梁,它允许Python程序直接执行和编译JavaScript代码,从而在Python环境中利用JavaScript的强大功能。这个名为"pyv8-...

    Python语言与javascript语言的区别.docx

    4. **函数式编程**:Python和JavaScript都支持函数式编程范式,能够使用高阶函数和闭包等概念。 5. **库支持**:两者都有庞大的第三方库生态系统,可以极大地提高开发效率。 #### 三、不同点 1. **用途**: - **...

    廖雪峰Python&Git&javascript教程离线版

    【标题】"廖雪峰Python&Git&JavaScript教程离线版"所涵盖的知识点非常广泛,包括了Python编程语言、Git版本控制工具以及JavaScript这三种在IT领域中至关重要的技术。接下来,我们将深入探讨这三个方面的内容。 **...

    【JavaScript源代码】详细聊聊浏览器是如何看闭包的.docx

    例如,在上述示例代码中,尽管`e`函数并未直接被调用或返回,但由于它与`f`函数共享相同的闭包,因此`c`变量也会被保留下来,不会被垃圾回收。 #### 如何判别内存垃圾 现代浏览器的垃圾回收机制主要依赖于可达性...

Global site tag (gtag.js) - Google Analytics