Jodie Zhang
Jodie Zhang
1. 利用function ``` var jsonStr = '{"age":20,"name":"jack"}' var json = (new Function('return '+jsonStr))() console.log(typeof json) ``` 2.利用eval ``` var rx_one = /^[\],:{}\s]*$/; var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;...
照抄阮大神的书 1. CommonJS模块输出的是一个值的**复制**,ES6模块输出的是值的**引用** 2. CommonJS模块是**运行时加载**,ES6模块是**编译时输出接口** 第二个差异是因为CommonJS加载的是一个对象,即module.export属性,该对象只有在脚本运行结束时才会生成。而ES6模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。 下面重点解释第一个差异。 CommonJS模块输出的是值的复制,一旦输出这个值,模块内部的变化就影响不到这个值。 ``` //lib.js 一个commonJS模块 var counter = 3 function incCounter() { counter++ } module.exports = { counter : counter, incCounter : incCounter, }...
创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后像真的是它做了所有工作一样,返回对象。 ``` function createAnother(original){ var clone=Object.create(original) //通过调用函数创建一个新的对象 clone.sayHi=function(){ //以某种方式来增强这个对象 console.log('Hi') } return clone //返回这个对象 } ``` ``` var person={ name:"Jodie", friends:["a","b","c"] } var anotherPerson=createAnother(person) anotherPerson.sayHi() ``` 缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率。
``` //发布者 Subject 构造函数 function Subject(name){ this.name = name, this.observerList=[] } Subject.prototype.registerOberver = function (observer) { if(this.observerList.indexOf(observer)==-1){ this.observerList.push(observer) } } Subject.prototype.removeOberver = function (observer) { if(this.observerList.indexOf(observer)) this.observerList.pop(observer) } Subject.prototype.refreshData =...
ECMAScript中描述了**原型链**的概念,并将原型链作为**实现继承**的主要方法。 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 可以理解为原型对象prototype就是两个引用类型的中间媒介。 有三个重要的概念:**构造函数,原型,实例** 理解三者的关系对理解原型链至关重要。 **每一个构造函数都有一个原型对象 原型对象都包含一个指向构造函数的指针 实例都包含一个指向原型对象的内部指针** ``` function Animal(){ this.type='Animal' } Animal.prototype.getType = function(){ return this.type } function Dog(){ this.name='拉布拉多' } Dog.prototype=new Animal() Dog.prototype.getName = function(){ return this.name...
1.执行上下文栈(Execution Context Stack(ECS))是执行JS代码时创建的执行栈结构。 2.全局执行上下文(Global Execution Context(GEC))全局执行上下文是文件第一次加载到浏览器,JS代码开始执行的默认上下文。在浏览器环境中,严格模式下this的值指向undefined,否则this的值为window对象。全局执行上下文只能有一个。 3.函数执行上下文(Functional Execution Context(FEC))函数执行时创建的执行上下文,每个函数都有自己的执行上下文。函数执行上下文可以获取到全局执行上下文中的内容。当在全局上下文中执行代码时JS引擎发现一个函数调用,则创建一个函数执行上下文。 3.Eval--先不做分析 全局执行上下文默认在执行上下文栈的最里面,当JS引擎发现一个函数调用,则**创建这个函数的函数执行上下文**,并把这个上下文push进栈,**JS引擎执行栈顶上下文关联的函数**,一旦函数执行完毕,则将其pop出栈,并往下执行。 我们再分析一下 **函数执行上下文的两个阶段:创建阶段和执行阶段** 创建阶段又叫编译阶段 1. 创建Variable Object 包含所有变量,函数参数和内部函数声明信息的特殊变量 2. 创建作用域链 一旦Variable Object创建完毕,JS引擎就开始初始化**作用域链**。作用域链是一个当前函数所在的可变对象的列表,其中包括全局作用域的可变对象和当前函数的可变对象。 3.决定this的值 初始化this值 执行阶段 在此阶段,JS引擎会重扫一边函数,用具体的变量值来更新可变对象,并执行代码内容 作用域链 ``` a =...