SlideShare a Scribd company logo
1 of 44
JavaScript  引擎技术 主讲:周爱民 ,[object Object],[object Object],[object Object],[object Object]
JavaScript 的语言特性 ,[object Object],[object Object],[object Object],[object Object]
程序设计语言的分类 UML ... 建模语言 模型设计语言 HTML , XML ... 标志语言 数据设计语言 Smalltalk, Eiffel, C++, Java, ... 面向对象 ** Fortran, Pascal, Basic, C, ... 冯 · 诺依曼 命令式 Prolog, VisiCalc 逻辑式 Id, Val 数据流式 * Lisp/Schemem, ML, Haskell 函数式 说明式 程序设计语言 计算机语言 注 语言示例 子类 层次分类
JavaScript 语言的知识系统 过程式 原型继承 跨度 难度 动态 说明式 静态 命令式 面向对象 函数式 动态语言
[object Object],[object Object],[object Object],[object Object],接下来的目标 ,[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],一般内置关键字
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],流程控制
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],异常处理
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],元类型系统与对象类型系统 无法直接定义和使用 undefined o  = { }; o1 = new Object(); Object object err = new Error(); Error a = [ ]; a1 = new Array(); Array foo1 = new Function(‘’, ‘’); Function String Number 引用 Boolean 全局对象: Math, Global 局部对象: arguments 其它: Date,  Enumerator,  RegExp s = ‘’; s1 = s; 引用 string f = function () {}; this.foo = f; 引用 function b = false; 赋值 Boolean i = 2; 赋值 number 备注 操作 类型 (typeof)
注1 :非构造器 注2 :不能直接引用 注3 :指引擎相对于 ECMA 扩展的原生对象     ( 左右两侧分别为 JScript 与 SpiderMonkey JS) 类型系统与对象系统 Object ( object ) boolean number string Function ( function ) 类型系统 typeof( ) undefined 值类型 引用类型 内置对象 构造器 直接量 包装类 Array String Boolean Number Function Error Date Math Arguments RegExp Enumerator ActiveXObject VBArray Debug Window Global 原生对象 XML Script Image 宿主对象 引擎扩展对象 Object Navigator ... 注1 注2 注2 注1 ... 注3
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],面向对象的基本概念 闭包 原型
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],JavaScript 面向对象的支持
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],原型问题 ,[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],对象系统的类型问题
[object Object],对象是什么? ,[object Object],[object Object]
[object Object],[object Object],原型 / 对象 - 属性包 aObj = new Object3(); function Object2() { } function Object3() { } Object.prototype.foo = ...; aObj.foo() Object.prototype Object2.prototype Object3.prototype Object2.prototype.foo = ...; aObj.foo() 性质 值 名 性质 值 名 R/D/E ... foo 性质 值 名 R/D/E ... foo aObj obj._proto_ O3.parent O2.parent 性质 值 名
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],主要函数式特性 ,[object Object],[object Object]
函数、函数实例、函数引用与闭包 闭包 变量 1 00040000 : mov eax, 100 //  位于运行空间的二进制代码 ... function myFunc() { // ... } 变量 2 ... 运行期 代码、编译期 变量 1 function myFunc() { // ... } function myFunc() { // ... } 变量 2 ... .. .. ... ... 运行期函数实例至少 有一个闭包,这时候 “ 函数实例  =  闭包” 函数实例具有多 个闭包的情况 变量 1 function myFunc() { // ... } function myFunc() { // ... } 变量 2 ... .. .. ... ... function .... 函数实例 函数 函数引用
第一次  一个实例多个闭包的例子 var checker; function myFunc() { if (checker) { checker(); } alert('do myFunc: ' + str); var str = 'test.'; if (!checker) { checker = function() { alert('do Check:' + str); } } return arguments.callee; } //  连续执行两次 myFunc() myFunc()(); do myFunc: undefined  返回同一个实例的引用  第二个调用运算 导致闭包创建  导致一个闭包被持用  第二次  do Check: test.  上一个闭包中的值 do myFunc: undefined 当前闭包中的值
[object Object],[object Object],闭包是什么?
[object Object],闭包是什么?
闭包内部结构上的存取规则
存取规则的简单描述 Object.prototype Object2.prototype 性质 值 名 Object3.prototype 性质 值 名 R/D/E ... foo 性质 值 名 R/D/E ... foo aObj obj._proto_ O3.parent O2.parent aFunc 脚本对象  .  变量 / 函数 ? 脚本对象  .  变量 / 函数 ? 脚本对象  .  变量 / 函数 ? upvalue upvalue context.body ?
[object Object],[object Object],[object Object],[object Object],主要动态语言特性 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
引擎的基本原理与模型 ,[object Object],[object Object]
JavaScript 怎样粘合语言特性 function a() { } (function() { var x; obj.aMethod( a(x = 100) ); })(); a undef. yes,   x no, next, yeah!   a 100 x anonymous 脚本对象 全局 脚本对象 () *anonymous 打开一个闭包 a 100 x = ( ) ( ) . obj ‘ aMethod’ 一次在对象及原型 属性包中的扫描 yes,   prop no, undef. P , I P , I , C ,  rt 过程:
什么是动态函数式语言? 函数式语言,其实不如说成是表达式语言! lambda 表达式运算是求值运算! 所以我们可以在一个语法树 ( 或其子树 ) 上执行它,其结果仍然是值! 我们把对象存取变成了原型链表上的 名称查找 ! 我们闭包/作用域变成了“脚本对象 ( 结构 )” 上的 名称查找 ! 动态语言= “在关联数组上的、动态的查找 ( 标识符 )” ,取得它/执行它! 语言= 数据结构+算法! lambda =  函数 ((. obj 'aMethod') ((a (= x 100)))) lambda ?函数式? 动态?
十分钟:休息,答疑 下一节的内容 JavaScript  语言规范的发展 JavaScript  引擎的发展 JavaScript 1.5 以后的扩展概要 基于 JavaScript 1.5 的框架扩展技术
JavaScript 语言规范的发展 ,[object Object],[object Object]
JavaScript 1.x 基于 JavaScript 1.1 Time NN2.0 JavaScript 1.0 1996.02 LiveScript Mocha 08 IE3.0 JScript 1.0 JScript 2.0 10 IE4.0 JScript 3.0 1997.06 NC4.0 JavaScript 1.2 NN3.0 JavaScript 1.1 CSS ECMA Ed1 ECMA Ed3 JavaScript 1.4 只由 Netscape 服务器端产品实现 JScript 4.0 只包含在 Visual Studio 早期的 SP 中 ECMA Ed2 1999.12 1998.06 NC4.8 2002.08 2001.10 IE6.0 JScript 5.6 2006.08  - 2006.10 IE7.0 JScript 5.7 2007.10 Netscape Browser 9 2004.11 - 2005.03 Netscape Browser 8 09 Phoenix 0.1 MozFirebird0.6 [2003.05] Mozilla FF 0.8 [2004.02] 2005.11 FF 1.5 [JS 1.6] Mozilla Firefox 1.0 FF 2.0b1 [JS 1.7] Mozilla Firefox 发布 1.0 Netscape  基于 FF 发展 Mozilla  开始独立 发展 JavaScript 1.x 08 NC4.06 JavaScript 1.3 11 Netscape 6 Mozilla 0.6 JavaScript 1.5 1998.01 Mozilla 11 AOL 收购 Mozilla 开源 10 Gecko 重写 Netscape 5 NC4.5 NC4.08 1999.03 IE5.0 JScript 5.0 2000.07 IE5.5 JScript 5.5 11 IE5.01 JScript 5.1 JScript 稳定版本 JavaScript 稳定版本
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],JavaScript 1.6-1.7
JavaScript 2 基于 AS and JS.NET Time 09 ECMA Ed4 [interim report] ES3:  对大型软件系统的抽象能力是较弱的,也缺乏一些大型编程系统中常用的机制(例如静态类型检查、早期绑定等) 此外,它是基于对象而非面向对象的,因此对象系统的表达能力也不足够。 TC39-TG1 [ECMA 技术员会 39- 任务组 1] 2008.Q2 2005 Today 2007.11.30 AS3:  使用双虚拟机支持 AS1-2 与 AS3 ,基本重写语言框架。 Mozilla 2 启动 ECMA Ed4 [release?] 2000.09 v2-v4 动作 (action) 脚本 2002.01 .NET 1.0 JScript .NET(7.x) .NET 1.1 2003.04 Flash Player 5.0 ActionScript 1.0 Flash Player 7.0 ActionScript 2 Mozilla Firefox 3 JScript.NET 8 2006.06 Adobe Flex 2.0 Flash Player 9 ActionScript 3 04 Adobe 收购 Macromedia 11 Tamarin (AVM2) 10 12 Atlas 1.0 Silverlight 1.0 10 2007.07 DLR 1.0 AJAX - RWC ASP.NET AJAX AIR (framework + AVM) ActionMonkey = Tamarin + SpiderMonkey IronMonkey = IronPython + IronRuby + Tamarin ScreamingMonkey = SpiderMonkey - Mozilla Vector Frames - RIA Dynamic Language JS 1.9 Javascript IronPython Dynamic VB Ruby
JavaScript 2(ECMA Ed4) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
JavaScript  引擎的发展 ,[object Object],[object Object],[object Object],[object Object]
引擎、应用环境 Your Objects, etc, function MyObject() {...} Native  Objects ,  etc, EvalError() Build-in  Objects , etc, Object(), Global.. Host  Objects, etc, ActiveXObject() 引擎 应用环境 宿主 ( 外壳是一种宿主 ) Runtime? JIT? VM?
JavaScript  引擎的谱系 ECMA Ed3 ECMA Ed4 Opera linear_b(7.0~9.24) futhark(9.5 or 10+) KJS(KDE) JavaScriptCore (in safari/webkit) Konqueror JavaScriptCore C++ Trolltech Qt Script for app. D Simple ECMAScript Engine (2007.08.15, 2.1.1277) NJS 0.25 alpha DMDScript D Language SEE NGS JS Interpreter 0.24 (New Generation Software) C C Free EcmaScript Interpreter (FESI 1.18, 2003.09.29) java JScript JScript.NET DLR WSH ? .NET CLR+CTS Internet Explorer .NET Mono JScript Mono DotGNU JScript Tamarin (AVM2) ActionScript2 ActionScript3 AIR ActionScript1 C Netscape SpiderMonkey ActionMonkey Javascript-C Raino Javascript-Java Raino Narcissus NarrativeJS C java JS Epimetheus Javascript-JS C++ Javascript-C++ JVM
[object Object],[object Object],[object Object],[object Object],DLR vs AVM vs JVM DLR xVM = vm_sys.eval_opcode(Interpreter(JIT, Code)) JIT compiler   common  compiler  infrastructure  CLR Javascript IronPython Dynamic VB Ruby Mutil-Languages common infrastructure such as Common Hosting Mechanisms HOST
Hosts vs Frameworks vs AIR ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],+JSP +XSLT +DB Silverlight +ADODB
其它引擎扩展技术 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
其它引擎扩展技术 rt = JS_NewRuntime(8L * 1024L * 1024L);  // max memory area cx = JS_NewContext(rt, 8192); // stack spaces glob = JS_NewObject(cx,  clasp , NULL, NULL); builtins = JS_InitStandardClasses(cx,  glob ); ... pdata = JS_GetPrivate(cx, obj);
[object Object],[object Object],[object Object],其它引擎扩展技术 ,[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],其它引擎扩展技术
[object Object],[object Object],其它引擎扩展技术
[object Object]

More Related Content

What's hot

Java面试题集
Java面试题集Java面试题集
Java面试题集yiditushe
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)Leo Hui
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 
12, string
12, string12, string
12, stringted-xu
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI建興 王
 
Java面试32题
Java面试32题Java面试32题
Java面试32题yiditushe
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算建興 王
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识yiditushe
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程Bobby Zhou
 
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Java SE 7 技術手冊第六章草稿 - 何謂繼承?Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Java SE 7 技術手冊第六章草稿 - 何謂繼承?Justin Lin
 
Java面试知识
Java面试知识Java面试知识
Java面试知识yiditushe
 
Java易犯错误
Java易犯错误Java易犯错误
Java易犯错误yiditushe
 
Java 開發者的函數式程式設計
Java 開發者的函數式程式設計Java 開發者的函數式程式設計
Java 開發者的函數式程式設計Justin Lin
 
《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿Justin Lin
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总yiditushe
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典yiditushe
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJustin Lin
 

What's hot (20)

Java面试题集
Java面试题集Java面试题集
Java面试题集
 
Scala
ScalaScala
Scala
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanup
 
12, string
12, string12, string
12, string
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI
 
Java面试32题
Java面试32题Java面试32题
Java面试32题
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
 
Java相关基础知识
Java相关基础知识Java相关基础知识
Java相关基础知识
 
Dev307
Dev307Dev307
Dev307
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程
 
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Java SE 7 技術手冊第六章草稿 - 何謂繼承?Java SE 7 技術手冊第六章草稿 - 何謂繼承?
Java SE 7 技術手冊第六章草稿 - 何謂繼承?
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
 
Java易犯错误
Java易犯错误Java易犯错误
Java易犯错误
 
Java 開發者的函數式程式設計
Java 開發者的函數式程式設計Java 開發者的函數式程式設計
Java 開發者的函數式程式設計
 
《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿《Python 3.5 技術手冊》第六章草稿
《Python 3.5 技術手冊》第六章草稿
 
Java面试笔试题大汇总
Java面试笔试题大汇总Java面试笔试题大汇总
Java面试笔试题大汇总
 
Java程序员面试之葵花宝典
Java程序员面试之葵花宝典Java程序员面试之葵花宝典
Java程序员面试之葵花宝典
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDEJava SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
 

Similar to Java Script 引擎技术

千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introductionotakustay
 
Javascript 培训第二节 基础上
Javascript 培训第二节 基础上Javascript 培训第二节 基础上
Javascript 培训第二节 基础上liziqi7
 
Javascript share
Javascript shareJavascript share
Javascript shareXu Mac
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
所谓闭包
所谓闭包所谓闭包
所谓闭包youzitang
 
Ecmascript
EcmascriptEcmascript
Ecmascriptjay li
 
所谓闭包
所谓闭包所谓闭包
所谓闭包ilovey4
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
JavaScript 脚本控件(二)
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)RANK LIU
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 

Similar to Java Script 引擎技术 (20)

千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Js培训
Js培训Js培训
Js培训
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
Javascript 培训第二节 基础上
Javascript 培训第二节 基础上Javascript 培训第二节 基础上
Javascript 培训第二节 基础上
 
Javascript share
Javascript shareJavascript share
Javascript share
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
Ecmascript
EcmascriptEcmascript
Ecmascript
 
Scala
ScalaScala
Scala
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
jasmine入门指南
jasmine入门指南jasmine入门指南
jasmine入门指南
 
JavaScript 脚本控件(二)
JavaScript 脚本控件(二)JavaScript 脚本控件(二)
JavaScript 脚本控件(二)
 
Clojure的魅力
Clojure的魅力Clojure的魅力
Clojure的魅力
 
Java script closures
Java script closuresJava script closures
Java script closures
 
Java script closures
Java script closuresJava script closures
Java script closures
 

Java Script 引擎技术

  • 1.
  • 2.
  • 3. 程序设计语言的分类 UML ... 建模语言 模型设计语言 HTML , XML ... 标志语言 数据设计语言 Smalltalk, Eiffel, C++, Java, ... 面向对象 ** Fortran, Pascal, Basic, C, ... 冯 · 诺依曼 命令式 Prolog, VisiCalc 逻辑式 Id, Val 数据流式 * Lisp/Schemem, ML, Haskell 函数式 说明式 程序设计语言 计算机语言 注 语言示例 子类 层次分类
  • 4. JavaScript 语言的知识系统 过程式 原型继承 跨度 难度 动态 说明式 静态 命令式 面向对象 函数式 动态语言
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10. 注1 :非构造器 注2 :不能直接引用 注3 :指引擎相对于 ECMA 扩展的原生对象     ( 左右两侧分别为 JScript 与 SpiderMonkey JS) 类型系统与对象系统 Object ( object ) boolean number string Function ( function ) 类型系统 typeof( ) undefined 值类型 引用类型 内置对象 构造器 直接量 包装类 Array String Boolean Number Function Error Date Math Arguments RegExp Enumerator ActiveXObject VBArray Debug Window Global 原生对象 XML Script Image 宿主对象 引擎扩展对象 Object Navigator ... 注1 注2 注2 注1 ... 注3
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18. 函数、函数实例、函数引用与闭包 闭包 变量 1 00040000 : mov eax, 100 // 位于运行空间的二进制代码 ... function myFunc() { // ... } 变量 2 ... 运行期 代码、编译期 变量 1 function myFunc() { // ... } function myFunc() { // ... } 变量 2 ... .. .. ... ... 运行期函数实例至少 有一个闭包,这时候 “ 函数实例 = 闭包” 函数实例具有多 个闭包的情况 变量 1 function myFunc() { // ... } function myFunc() { // ... } 变量 2 ... .. .. ... ... function .... 函数实例 函数 函数引用
  • 19. 第一次 一个实例多个闭包的例子 var checker; function myFunc() { if (checker) { checker(); } alert('do myFunc: ' + str); var str = 'test.'; if (!checker) { checker = function() { alert('do Check:' + str); } } return arguments.callee; } // 连续执行两次 myFunc() myFunc()(); do myFunc: undefined 返回同一个实例的引用 第二个调用运算 导致闭包创建 导致一个闭包被持用 第二次 do Check: test. 上一个闭包中的值 do myFunc: undefined 当前闭包中的值
  • 20.
  • 21.
  • 23. 存取规则的简单描述 Object.prototype Object2.prototype 性质 值 名 Object3.prototype 性质 值 名 R/D/E ... foo 性质 值 名 R/D/E ... foo aObj obj._proto_ O3.parent O2.parent aFunc 脚本对象 . 变量 / 函数 ? 脚本对象 . 变量 / 函数 ? 脚本对象 . 变量 / 函数 ? upvalue upvalue context.body ?
  • 24.
  • 25.
  • 26. JavaScript 怎样粘合语言特性 function a() { } (function() { var x; obj.aMethod( a(x = 100) ); })(); a undef. yes,  x no, next, yeah!  a 100 x anonymous 脚本对象 全局 脚本对象 () *anonymous 打开一个闭包 a 100 x = ( ) ( ) . obj ‘ aMethod’ 一次在对象及原型 属性包中的扫描 yes,  prop no, undef. P , I P , I , C , rt 过程:
  • 27. 什么是动态函数式语言? 函数式语言,其实不如说成是表达式语言! lambda 表达式运算是求值运算! 所以我们可以在一个语法树 ( 或其子树 ) 上执行它,其结果仍然是值! 我们把对象存取变成了原型链表上的 名称查找 ! 我们闭包/作用域变成了“脚本对象 ( 结构 )” 上的 名称查找 ! 动态语言= “在关联数组上的、动态的查找 ( 标识符 )” ,取得它/执行它! 语言= 数据结构+算法! lambda = 函数 ((. obj 'aMethod') ((a (= x 100)))) lambda ?函数式? 动态?
  • 28. 十分钟:休息,答疑 下一节的内容 JavaScript 语言规范的发展 JavaScript 引擎的发展 JavaScript 1.5 以后的扩展概要 基于 JavaScript 1.5 的框架扩展技术
  • 29.
  • 30. JavaScript 1.x 基于 JavaScript 1.1 Time NN2.0 JavaScript 1.0 1996.02 LiveScript Mocha 08 IE3.0 JScript 1.0 JScript 2.0 10 IE4.0 JScript 3.0 1997.06 NC4.0 JavaScript 1.2 NN3.0 JavaScript 1.1 CSS ECMA Ed1 ECMA Ed3 JavaScript 1.4 只由 Netscape 服务器端产品实现 JScript 4.0 只包含在 Visual Studio 早期的 SP 中 ECMA Ed2 1999.12 1998.06 NC4.8 2002.08 2001.10 IE6.0 JScript 5.6 2006.08 - 2006.10 IE7.0 JScript 5.7 2007.10 Netscape Browser 9 2004.11 - 2005.03 Netscape Browser 8 09 Phoenix 0.1 MozFirebird0.6 [2003.05] Mozilla FF 0.8 [2004.02] 2005.11 FF 1.5 [JS 1.6] Mozilla Firefox 1.0 FF 2.0b1 [JS 1.7] Mozilla Firefox 发布 1.0 Netscape 基于 FF 发展 Mozilla 开始独立 发展 JavaScript 1.x 08 NC4.06 JavaScript 1.3 11 Netscape 6 Mozilla 0.6 JavaScript 1.5 1998.01 Mozilla 11 AOL 收购 Mozilla 开源 10 Gecko 重写 Netscape 5 NC4.5 NC4.08 1999.03 IE5.0 JScript 5.0 2000.07 IE5.5 JScript 5.5 11 IE5.01 JScript 5.1 JScript 稳定版本 JavaScript 稳定版本
  • 31.
  • 32. JavaScript 2 基于 AS and JS.NET Time 09 ECMA Ed4 [interim report] ES3: 对大型软件系统的抽象能力是较弱的,也缺乏一些大型编程系统中常用的机制(例如静态类型检查、早期绑定等) 此外,它是基于对象而非面向对象的,因此对象系统的表达能力也不足够。 TC39-TG1 [ECMA 技术员会 39- 任务组 1] 2008.Q2 2005 Today 2007.11.30 AS3: 使用双虚拟机支持 AS1-2 与 AS3 ,基本重写语言框架。 Mozilla 2 启动 ECMA Ed4 [release?] 2000.09 v2-v4 动作 (action) 脚本 2002.01 .NET 1.0 JScript .NET(7.x) .NET 1.1 2003.04 Flash Player 5.0 ActionScript 1.0 Flash Player 7.0 ActionScript 2 Mozilla Firefox 3 JScript.NET 8 2006.06 Adobe Flex 2.0 Flash Player 9 ActionScript 3 04 Adobe 收购 Macromedia 11 Tamarin (AVM2) 10 12 Atlas 1.0 Silverlight 1.0 10 2007.07 DLR 1.0 AJAX - RWC ASP.NET AJAX AIR (framework + AVM) ActionMonkey = Tamarin + SpiderMonkey IronMonkey = IronPython + IronRuby + Tamarin ScreamingMonkey = SpiderMonkey - Mozilla Vector Frames - RIA Dynamic Language JS 1.9 Javascript IronPython Dynamic VB Ruby
  • 33.
  • 34.
  • 35. 引擎、应用环境 Your Objects, etc, function MyObject() {...} Native Objects , etc, EvalError() Build-in Objects , etc, Object(), Global.. Host Objects, etc, ActiveXObject() 引擎 应用环境 宿主 ( 外壳是一种宿主 ) Runtime? JIT? VM?
  • 36. JavaScript 引擎的谱系 ECMA Ed3 ECMA Ed4 Opera linear_b(7.0~9.24) futhark(9.5 or 10+) KJS(KDE) JavaScriptCore (in safari/webkit) Konqueror JavaScriptCore C++ Trolltech Qt Script for app. D Simple ECMAScript Engine (2007.08.15, 2.1.1277) NJS 0.25 alpha DMDScript D Language SEE NGS JS Interpreter 0.24 (New Generation Software) C C Free EcmaScript Interpreter (FESI 1.18, 2003.09.29) java JScript JScript.NET DLR WSH ? .NET CLR+CTS Internet Explorer .NET Mono JScript Mono DotGNU JScript Tamarin (AVM2) ActionScript2 ActionScript3 AIR ActionScript1 C Netscape SpiderMonkey ActionMonkey Javascript-C Raino Javascript-Java Raino Narcissus NarrativeJS C java JS Epimetheus Javascript-JS C++ Javascript-C++ JVM
  • 37.
  • 38.
  • 39.
  • 40. 其它引擎扩展技术 rt = JS_NewRuntime(8L * 1024L * 1024L); // max memory area cx = JS_NewContext(rt, 8192); // stack spaces glob = JS_NewObject(cx, clasp , NULL, NULL); builtins = JS_InitStandardClasses(cx, glob ); ... pdata = JS_GetPrivate(cx, obj);
  • 41.
  • 42.
  • 43.
  • 44.