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

比较javascript学python-2 闭包实现

阅读更多

python源码剖析是本好书,看了能睡不着觉的,可惜为何没有javascript源码剖析,c系能手啥时能来研究v8?


承接 比较javascript学 python-1 对象与类 ,先给出两个语言使用闭包的例子:

 

代码举例:

 

javascript:

 

function outer(){
  var value="inner";
  function inner(){
     alert(value);
  }
  return inner;
}

var c=outer();
c();

 

python:

 

def outer():
 value="inner"
   def inner():
      print value
    return inner

c=outer()
c()
   

实现:


javascript:


根据 ecmascript5 10.3 章 (链接待引):函数运行时会产生 execution context,而execution context中包含 LexicalEnvironment (Identifies the Lexical Environment used to resolve identifier references made by code within this execution context.) 为链状结构,用来解析运行时函数内的变量引用,上例图解:



可见,嵌套函数内的变量访问复杂度是O(函数的嵌套层次), Nicholas C. Zakas专门提到了这个问题(链接待引),当需要多次访问某个外部作用域变量时,要先copy一个到本函数局部变量中来。

 

对应上例的小题大做改动:

 

function outer(){
  var value="inner";
  function inner(){
     var innervalue=value;
     //多次访问
     alert(innervalue);
     alert(innervalue);
     alert(innervalue);
  }
  return inner;
}
var c=outer();
c();

 

PS:对于一些注重性能的javascript引擎譬如webkit,会索引变量,避免传统的作用域链查询,使得变量在作用域链中的深度于chrome,safari中变得无关紧要。(IE还是很紧要的:))

 

来源 High Performance Javascript:

 

python:


根据 python源码剖析(链接待引) ,函数运行时会产生 PyFrameObject (等同ecmascript规范描述的 execution context),而闭包涉及外层作用域变量直接被(指针引用?)放到了内层函数的 PyFrameObject 中的自由变量部分tuple结构中,解析时直接访问本PyFrameObject的tuple结构即可。

 


可见,嵌套函数内的变量访问复杂度是O(1),但是python由于没有变量声明语句存在以下问题:

 

python:

 

(由于没有申明变量关键字!造成不能修改上层作用域的变量,只能引用,直接赋值同名变量就算覆盖了)

 

def outerFunc():
    a=1;
    def innerFunc():
        a=2
    innerFunc()
    print a


outerFunc()

  而只能变通一下:

 

def outerFunc():
    a=[1];
    def innerFunc():
        a[0]=2
    innerFunc()    
    print a

outerFunc()
 

 

Javascript:

 

(function(){
var a=1;

(function(){
a=2;
})();

alert(a);

})();

 

updated: 2011-05-25

从黑客与画家一书中看到这也就是经典的累加器例子:

 

javascript 可以:

 

function foo(n){
  return function(i){
     return n+=i;
  };
}
 

而 python 则必须为:

 

def foo(n):
  s=[n]
  def bar(i) :
     s[0]+=i
   return s[0]
  return bar
   

python 也可以绕过用对象属性来代替原来的词法作用域的变量:

 

def foo(n):
  class acc:
     //构造器
     def __init__(self,s)
        self.s=s
     def inc(self,i):
        self.s+=i
        return self.s
    //词法作用域变量放到对象属性内维护
    return acc(n).inc 

 

或override 隐藏的 __call__,直接封存变量到对象属性

 

class foo:
  def __init__(self,n):
    self.n=n
  //作为函数调用时
  def __call__(self,i)
    self.n+=i
    return self.n

inc=foo(5)
inc(1) //=>6
inc(2) //=>8
 

但这只能解决一层词法作用域问题

 

java 就更不行,只有个近似实现

 

可以在函数中搞个匿名接口子类的对象,而这个匿名接口子类可访问函数内 final 的变量:

 

public interface inc{
  public int call(int i);
}

public static inc foo(final int n){
  return new inc(){
       int s=n;
       public int call(int i){
          return s+=i;
       }
  }
}
 

 

 

 

 

  • 大小: 34.3 KB
  • 大小: 27.4 KB
  • 大小: 86.1 KB
分享到:
评论

相关推荐

    (知识引用自)廖雪峰-JavaScript-Python-Git-教程-by-it-ebooks-_z-lib.org_1

    19. **AJAX**:异步JavaScript和XML,用于实现页面无刷新通信。 20. **Promise**:用于处理异步操作的工具,解决了回调地狱问题。 21. **Canvas**:HTML5画布,用于在网页上绘制图形。 22. **jQuery**:一个广泛...

    华为OD机考-统一考试机试-含ABCD卷-含java、c++、JavaScript、python-题目

    在华为OD机考中,JavaScript的题目可能包括函数、闭包、原型链、异步编程(Promise、async/await)、DOM操作、ES6新特性等。掌握JavaScript的动态类型、事件循环机制以及跨域解决方案是前端工程师的关键技能。 ...

    Python-用PythonJS和Go实现的算法

    Python的面向对象特性使得类和继承易于实现这些模式,JavaScript的原型继承和闭包可以模拟多种设计模式,Go则通过接口和结构体来实现。 在实际项目中,Rosetta_Project-master可能是一个代码仓库,其中包含了用...

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

    通过PyV8,你可以执行单行或多行JavaScript代码,创建并操作JavaScript对象,甚至可以将Python对象暴露给JavaScript环境,实现两者之间的数据交换。 在跨平台方面,这个压缩包包含了Linux和Windows两个操作系统下的...

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

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

    廖雪峰:Git-Python-JS 教程

    廖雪峰老师所著的“Git-Python-JS 教程”为编程新手提供了一站式的学习资源,其中涵盖了当下最受欢迎的三种技术:版本控制工具Git、动态编程语言Python以及前端技术JavaScript。 首先,关于Git的部分,Git是一个...

    Python-经典编程书籍大全

    - 《JavaScript高级程序设计》:全面讲解JavaScript语言特性,包括闭包、原型链等。 - 《CSS实战》:深入理解CSS布局、选择器和动画,提升网页设计能力。 5. 后端开发: - 《Python编程:从入门到实践》:介绍...

    廖雪峰javascript,python和git教程

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

    python-javascript_coding-exercises

    结合这两个语言的编程练习,学习者可以比较它们之间的异同,例如Python是静态类型语言,JavaScript是动态类型语言;Python强调代码规范,JavaScript则相对灵活。这样的对比练习有助于深入理解两种语言的特点和适用...

    Python、Javascript中的闭包比较

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

    jiaoben-python-188515.pdf

    - **Python函数使用技巧总结**:深入理解函数参数、作用域、闭包等特性。 - **Python字符串操作技巧汇总**:学习字符串拼接、查找、替换、分割等方法。 - **Python文件与目录操作技巧汇总**:熟悉文件读写、目录遍历...

    Python-Clojurecademy一个交互式平台提供基于Clojure的课程

    Python-Clojurecademy是一个独特的在线学习平台,专注于教授Clojure编程语言。它借鉴了Codecademy的成功模式,为用户提供了一个交互式的环境,使学习者能够实时实践Clojure代码,从而增强他们的编程技能。Clojure是...

    Python-For-JS:一些适用于Javascript的Python函数

    - **闭包(Closures)**:Python和JavaScript都支持闭包,可以用来创建私有变量或实现函数工厂。 - **装饰器(Decorators)**:Python的装饰器允许你修改或增强函数的行为。在JavaScript中,可以使用函数或类的`@...

    关于javascript、Python100道题

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

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

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

    廖雪峰 JavaScript Python Git 教程

    JavaScript可以改变DOM(文档对象模型)以实现动态更新内容,通过AJAX实现异步数据交换,提供更流畅的用户体验。在前端,JavaScript可以处理用户输入、控制多媒体、动画等;在后端,Node.js框架使得JavaScript也能...

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

    在廖雪峰的JavaScript教程中,你将学习到变量、数据类型、函数、对象、闭包、异步编程等基础知识,以及如何利用DOM操作页面元素,实现动态效果和AJAX通信。此外,教程可能还会涵盖ES6及其后的特性,如箭头函数、模板...

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

    本资源集合了廖雪峰的在线教程精华,涵盖了JavaScript、Python(包括Python2和Python3)以及Git三个重要领域,对于学习者来说是一份极具价值的学习资料。以下是这些教程中的关键知识点: **JavaScript** JavaScript...

Global site tag (gtag.js) - Google Analytics