第四章混合对象"类"
类理论 类/继承描述了一种代码组织形式,类和继承是对真实世界中事物的抽象和建模。 类意味着复制,传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会被 复制到子类中 “类设计模式” 类其实是一种软件设计模式,是一种可选的代码抽象。 JavaScript中的"类" JavaScript中并没有真正的类,只有近似类的语法, 因为JavaScript并不会像类那样自动创建对象 的副本。 ...
类理论 类/继承描述了一种代码组织形式,类和继承是对真实世界中事物的抽象和建模。 类意味着复制,传统的类被实例化时,它的行为会被复制到实例中。类被继承时,行为也会被 复制到子类中 “类设计模式” 类其实是一种软件设计模式,是一种可选的代码抽象。 JavaScript中的"类" JavaScript中并没有真正的类,只有近似类的语法, 因为JavaScript并不会像类那样自动创建对象 的副本。 ...
语法 对象有两种定义形式:声明形式和构造形式 声明形式: 1 var obj = {} 构造形式: 1 var obj = new Object() 类型 在JavaScript中共有6种基本类型(现在是7种) string number boolean null undefined object 还有一种symbol类型 简单基本类型并不是对象,虽然typeof null === 'object',但是这个语言的一个bug ...
绑定规则 this的绑定规则总结起来总共有四种: 默认绑定 隐式绑定 显式绑定 new绑定 默认绑定 这条规则是无法应用其它绑定时的默认规则,思考以下代码: 1 2 3 4 5 6 function foo() { console.log(this.a) } var a = 2 foo() // 2 ...
为什么要用this this保存着上下文对象,避免显式地传递上下文对象 this到底是什么 this是在运行时绑定的,并不是在编写时绑定的,它的的上下文取决于函数调用时的各种条件,this的绑定和函数声明的位置没有任何关系, 只取决于函数的调用方式。
实质问题, 闭包的定义 当函数访问并记住所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。 (个人理解)闭包并没有什么神奇的,闭包是词法作用域的特性,函数能够保存它本身的词法作用域的变量是肯定的, 即使这个函数嵌套在另一个函数里面也不例外。 循环和闭包 闭包用来保存循环变量的值,每一次循环都创建一个副本。 如下代码: 1 2 3 4 5 6 7 for(var i=1; i<=5; i++) { (function(j) setTimeout(function timer(){ console.log(j) }) {})(i) } 模块 可以利用闭包去构建模块,封装私有属性和方法,然后暴露给外部方案修改内部的属性。
什么是提升 所有的声明(变量或者函数声明)会被移动到各自作用域的最顶端,这个过程被称作"提升",提升的过程是发生在代码被执行之前的编译阶段, 无论作用域的声明出现在什么地方,都将在代码被执行之前首先处理。 var a = 2 问题 1 2 3 a = 2 var a console.log(a) // 2 可以看到,编译时变量a被提升,此处打印出2 另一个例子 1 2 console.log(a) // undefined var a = 2 以上代码等价于: 1 2 3 var a console.log(a) a = 2 打印出a是undefined是显而易见的 ...
函数作用域 JavaScript具有函数作用域,主要具有这几点好处: 隐藏内部实现,符合软件设计中的最小特权原则。 规避冲突。函数作用域可以当做命名空间隐藏变量,避免暴露到全局作用域发生冲突。 块作用域 虽然函数作用域是JavaScript中最常见的作用域单元,但块作用域在JavaScript中也是存在的,只不过(个人理解)JavaScript中的块作用域只是针对块中的某个变量 来说的。 ...
什么是词法作用域 简单来讲,词法作用域就是定义在词法阶段的作用域,换句话说,词法作用域是由你在写代码时将变量和块作用域写在哪里决定的。 遮蔽效应 作用域查找会在找到第一个匹配的标识符时停止,在多层嵌套的作用域中可以定义同名的标识符,这叫做"遮蔽效应" 欺骗词法 欺骗词法作用域会导致性能下降 eval eval 可以对一段包含代码的字符串进行演算,并借此来修改词法作用域。 非严格模式下,eval会对其所在的词法作用域进行修改,严格模式下,其有自己的词法作用域,不会对所在的词法作用域造成修改。 ...
编译原理 传统编译语言的流程中,编译会执行三个步骤: 分词/词法分析 这个阶段将代码分解成词法单元,比如var a = 2,分解成var、a、=、2 解析/语法分析 将词法单元转换成抽象语法树(AST) 代码生成 将抽象语法树转换成可执行代码 JavaScript的编译有什么不同 JavaScript的编译过程不是发生在构建之前,而是发生在执行前的几微秒或者更短的时候,因此,JavaScript不会像其它语言那样有大量的时间去做优化。 ...