您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > JavaScript+引擎技术
JavaScript引擎技术主讲:周爱民JavaScript语言与引擎技术JavaScript语言规范的发展JavaScript引擎的发展JavaScript的扩展JavaScript的语言特性过程式是入门特性原型继承是对象框架特性函数式是其语言的根基动态特性是粘合与催化剂程序设计语言的分类层次分类子类语言示例注计算机语言程序设计语言说明式函数式Lisp/Schemem,ML,Haskell*数据流式Id,Val逻辑式Prolog,VisiCalc命令式冯·诺依曼Fortran,Pascal,Basic,C,...**面向对象Smalltalk,Eiffel,C++,Java,...数据设计语言标志语言...HTML,XML模型设计语言建模语言...UML过程式原型继承跨度难度JavaScript语言的知识系统函数式动态语言动态说明式静态命令式面向对象•JavaScript语言的原子特性–值与引用–闭包与作用域(函数、函数实例、函数闭包)–引擎如何实现这些特性•搞清以下问题–原型继承是怎么回事–函数闭包的怎么回事–动态语言的怎么回事–融合:JavaScript引擎是如何做到的?接下来的目标•var–无初值变量:varx–变量初值:varx=100–局部变量与全局变量:x=100•typeof–六种类型:“number”、“string”、“boolean”、undefined、object和function。•delete•void•undefined与空–undefined是一种类型;null是一个对象。–null是关键字;undefined不是关键字(高版本中是一个全局成员)–null对象没有方法。–null==undefined==false–null!==undefined!==false一般内置关键字•条件:if(*expression)...else...•循环:for(*from,*to,*step)...•循环:while(){...};do{...}while(*expression);•过程:function*name(*params){...}•分支:switch(*expression){case*value:...;case*value:...;default:...;}•中断:break*lable;•继续:continue*lable;•返回:return*result;流程控制•异常对象创建*exception=newError(*number,*description)•异常触发语法throw*exception•异常捕获语法try{//tryStatements}catch(*exception){//catchStatementsif(*exception.number==10){//...}elsethrow*exception;}finally{//finallyStatements}•异常(对象)记录:name,number与description•异常的种类:运行时错误、语法错误异常处理•产生一个新的实例–直接定义(基础类型)–obj=newMyObject()•赋值与引用–基础类型使用值运算:Number、Boolean和String–对象类型:引用元类型系统与对象类型系统类型(typeof)操作备注undefined无法直接定义和使用number赋值i=2;Boolean赋值b=false;string引用s=‘’;s1=s;function引用f=function(){};this.foo=f;objectBoolean引用NumberStringFunctionfoo1=newFunction(‘’,‘’);Arraya=[];a1=newArray();Objecto={};o1=newObject();Errorerr=newError();其它:Date,Enumerator,RegExp局部对象:arguments全局对象:Math,GlobalObject(object)booleannumberstringFunction(function)类型系统typeof()undefined值类型引用类型注1:非构造器注2:不能直接引用注3:指引擎相对于ECMA扩展的原生对象(左右两侧分别为JScript与SpiderMonkeyJS)内置对象构造器直接量包装类ArrayStringBooleanNumberFunctionErrorDateMathArgumentsRegExpEnumeratorActiveXObjectVBArrayDebugWindowGlobal原生对象XMLScriptImage宿主对象引擎扩展对象ObjectNavigator...注1注2注2注1...注3类型系统与对象系统•对象:一个有继承关系的记录–封装(域-访问权限):可见性(编译实现与语法解释)•私有(private)、保护(protected)、公开(public)……–继承性–多态问题•面向对象的基本设计模型:PME–字段(成员)与属性:field,Property(get/set)–方法:Method•类方法、对象方法、类静态方法……–事件与消息:Event,message面向对象的基本概念闭包原型•成员列举(反射):for..in•成员存取:[],.•成员检查:in关键字(运算)•with关键字:打开对象闭包•this关键字:方法调用时的实例引用•继承检查:instanceof关键字(运算)•对象构造:new关键字(运算)JavaScript面向对象的支持•JavaScript使用原型来实现继承。•原型定义:functionMyObject(){...}functionMyObject2(){//(类抄写)...}MyObject2.prototype=newMyObject();MyObject2.prototype.XXX=...;//原型修改原型问题•原型:对象构造时使用的基本模板。obj=newMyObject2();//等效于this=newMyObject2._proto_.constructor();obj=MyObject2.apply(this);•JavaScript没有严格的类类型•isPrototypeOf与instanceof的实现–result=objectinstanceofclass–object1.isPrototypeOf(object2)–if(objectinstanceofclass){result=class.prototype.isPrototypeOf(object)}//resultistrue!•类型识别的基础:构造器(函数)引用对象系统的类型问题对象是什么?•数组的两种实现方案•对象=关联数组=属性包=存储体•对象只有成员访问操作原型/对象-属性包//Object2.prototype=newObject();Object3.prototype=newObject2();aObj=newObject3();functionObject2(){}functionObject3(){}Object.prototype.foo=...;aObj.foo()Object.prototypeObject2.prototype性质值名Object3.prototypeObject2.prototype.foo=...;aObj.foo()性质值名R/D/E...foo性质值名R/D/E...fooaObjobj._proto_O3.parentO2.parent性质值名主要函数式特性•可变参数以及使用值参数传递•无副作用•非惰性求值•副作用带来的影响:function(){...}(x=y);•函数是一个值(引用类型的数据)•表达式运算元:f(f++);•可访问调用栈•函数闭包与对象闭包函数、函数实例、函数引用与闭包变量100040000:moveax,100//位于运行空间的二进制代码...functionmyFunc(){//...}变量2...运行期代码、编译期变量1functionmyFunc(){//...}functionmyFunc(){//...}变量2.............闭包运行期函数实例至少有一个闭包,这时候“函数实例=闭包”函数实例具有多个闭包的情况变量1functionmyFunc(){//...}functionmyFunc(){//...}变量2.............function....函数实例函数函数引用第二次doCheck:test.第一次一个实例多个闭包的例子varchecker;functionmyFunc(){if(checker){checker();}alert('domyFunc:'+str);varstr='test.';if(!checker){checker=function(){alert('doCheck:'+str);}}returnarguments.callee;}//连续执行两次myFunc()myFunc()();domyFunc:undefined返回同一个实例的引用第二个调用运算导致闭包创建上一个闭包中的值domyFunc:undefined当前闭包中的值导致一个闭包被持用闭包是什么?•闭包与作用域–闭包带来的作用域仅有两个:闭包内与闭包外闭包是什么?•与内部执行体相关的结构闭包内部结构上的存取规则存取规则的简单描述Object.prototypeObject2.prototype性质值名Object3.prototype性质值名R/D/E...foo性质值名R/D/E...fooaObjobj._proto_O3.parentO2.parentaFunc脚本对象.变量/函数?脚本对象.变量/函数?脚本对象.变量/函数?upvalueupvaluecontext.body?主要动态语言特性•重写–引擎对重写的完全支持:完全动态绑定–宿主的限制–宿主对象系统的限制•动态执行系统•动态类型系统–类型转换:valueOf(),toString()–包装类(装箱与拆箱)•对象与数组的动态含义–表的散列与顺序访问引擎的基本原理与模型语法分析动态执行JavaScript怎样粘合语言特性functiona(){}(function(){varx;obj.aMethod(a(x=100));})();anonymous脚本对象全局脚本对象()*anonymous打开一个闭包a100x=()().obj‘aMethod’aundef.yes,xno,next,yeah!a100一次在对象及原型属性包中的扫描yes,propno,undef.P,IP,I,C,rt过程:x什么是动态函数式语言?函数式语言,其实不如说成是表达式语言!lambda=函数((.obj'aMethod')((a(=x100))))lambda?函数式?动态?lambda表达式运算是求值运算!所以我们可以在一个语法树(或其子树)上执行它,其结果仍然是值!我们把对象存取变成了原型链表上的名称查找!我们闭包/作用域变成了“脚本对象(结构)”上的名称查找!动态语言=“在关联数组上的、动态的查找(标识符)”,取得它/执行它!语言=数据结构+算法!十分钟:休息,答疑下一节的内容JavaScript语言规范的发展JavaScript引擎的发展JavaScript1.5以后的扩展概要基于JavaScript1.5的框架扩展技术JavaScript语言规范的发展JS1.x–强弩之末JS2.0–群雄争霸基于JavaScript1.1JavaScript1.xTimeNN2.0JavaScript1.01996.02LiveScriptMocha08IE3.0JScript1.0JScript2.010IE4.0JScript3.01997.06NC4.0JavaSc
本文标题:JavaScript+引擎技术
链接地址:https://www.777doc.com/doc-3600557 .html