下列代码很好的展示了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表现一致!
参考 :
python闭包
分享到:
相关推荐
详解JavaScript闭包问题 闭包是纯函数式编程语言的传统特性之一。通过将闭包视为核心语言构件的组成部分,JavaScript语言展示了其与函数式编程语言的紧密联系。由于能够简化复杂的操作,闭包在主流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 教程合集》是一份全面且深入的编程学习资源,涵盖了现代软件开发中至关重要的三种技术:Git版本控制工具、JavaScript编程语言以及Python编程语言(包括Python 3和...
闭包在很多语言中都有应用,比如Python、JavaScript等。 闭包函数的定义:在Python中,闭包是由一个外部函数和一个内部函数组成的,内部函数引用了外部函数的局部变量,即使外部函数已经执行完毕,这些变量仍然可以...
廖雪峰是知名的IT教育工作者,提供了丰富的在线课程,涵盖了编程语言JavaScript、Python和版本控制系统Git的教程。下面是根据提供的文件信息,对这些教程内容的详细知识点梳理。 ### JavaScript教程 #### ...
2. **控制结构**:与 JavaScript 类似,Python 也有 `if...else`、`for` 和 `while` 循环。 3. **函数**:Python 函数用 `def` 关键字定义,支持默认参数、可变参数和关键字参数。 4. **类与对象**:Python 是面向...
JavaScript教程将涵盖基础语法、对象、函数、闭包、异步操作等内容,帮助初学者掌握JavaScript的核心概念。Python教程会讲解变量、数据类型、控制流、函数、类等基础知识,以及进阶话题如装饰器、生成器和元类。Git...
上面那句话听起来可能不是很理解,本人在之前写过一篇Python 闭包小记》的关于 Python 闭包的一些知识的文章,里面写了百度百科对于闭包的理解,虽然由于才疏学浅大部分都是引用的他人的知识架构,但语言这种东西都...
在Java中,你可以使用Lambda表达式或匿名内部类来创建闭包,而在JavaScript中,所有的函数都是闭包。在C#中,可以使用`Action`、`Func`等委托类型或`lambda`表达式来创建闭包。 总的来说,闭包在编程中扮演着至关...
### JavaScript闭包与垃圾回收机制详解 #### 一、闭包 ##### 1.1 闭包是什么? 闭包(Closure)是JavaScript中一个非常重要的概念,它涉及到函数及其相关的词法作用域。简单来说,闭包就是能够访问其自身作用域...
### 廖雪峰 JavaScript Python Git 教程 #### JavaScript 教程概览 ##### JavaScript 简介 - **用途**: JavaScript 是一种轻量级的脚本语言,主要用于网页的交互控制。 - **特点**: 动态类型、弱类型、基于原型。 ...
3. **作用域与闭包**:解释了JavaScript中的作用域规则以及闭包机制,这是理解和解决内存管理问题的关键。 4. **异步编程**:介绍了事件循环、回调函数、Promise以及async/await等处理异步操作的方法。 5. **DOM...
2. **函数**:定义函数、参数传递、匿名函数、箭头函数、函数作用域与闭包。 3. **对象和数组**:对象字面量、原型链、构造函数、数组方法(如map、filter、reduce等)。 4. **DOM操作**:选取元素、添加删除元素...
JavaScript是Web开发中的核心语言,其重要特性包括同步与异步处理、作用域与闭包、以及原型和原型链。这些概念是理解JS高级特性的基石。 **同步与异步的区别** 在JavaScript中,同步执行意味着代码按照顺序依次运行...
《PyV8:跨越平台与Python版本的JavaScript引擎解析》 PyV8是Python与V8 JavaScript引擎交互的桥梁,它允许Python程序直接执行和编译JavaScript代码,从而在Python环境中利用JavaScript的强大功能。这个名为"pyv8-...
4. **函数式编程**:Python和JavaScript都支持函数式编程范式,能够使用高阶函数和闭包等概念。 5. **库支持**:两者都有庞大的第三方库生态系统,可以极大地提高开发效率。 #### 三、不同点 1. **用途**: - **...
【标题】"廖雪峰Python&Git&JavaScript教程离线版"所涵盖的知识点非常广泛,包括了Python编程语言、Git版本控制工具以及JavaScript这三种在IT领域中至关重要的技术。接下来,我们将深入探讨这三个方面的内容。 **...
例如,在上述示例代码中,尽管`e`函数并未直接被调用或返回,但由于它与`f`函数共享相同的闭包,因此`c`变量也会被保留下来,不会被垃圾回收。 #### 如何判别内存垃圾 现代浏览器的垃圾回收机制主要依赖于可达性...