你不知道的js上卷
EDB
这个作者很懒,什么都没留下…
展开
-
第一章 作用域是什么
LHS查询: 查早变量所在的地址,如果在作用域链中,找不到那么在全局环境下进行声明,但是在严格模式下找不到就会报ReferenceError的错误 RHS查询: 查早变量的值,如果如果在作用域链找不到,报ReferenceError的错误, 如找到了但对这个值进行不合理的操作,调用非函数类型,或者引用null或undefined类型中的值,那么会抛出TypeError的错误 ...原创 2018-11-22 21:05:51 · 148 阅读 · 0 评论 -
第二章 词法作用域
其实就是指的我们平时说的作用域、作用域链这些。 查找 词法作用域查找,只会查早一级标识符,如果遇到了foo.bar.baz这种,词法作用域只会查找foo标识符,找到这个变量之后,对象的访问属性规则会分别接管对bar和baz属性的访问。 欺骗词法 这种做法会导致性能下降,因为他们会修改或者创建新的作用域。javaScript引擎会在编译阶段进行数项优化,其中有一项就是能够根据代码的词法进行静态分析,...原创 2018-11-22 21:32:01 · 143 阅读 · 0 评论 -
第三章 函数作用域和块作用域
函数作用域 可以使用作用域来隐藏变量,在软件设计中,应该最小限度的暴露必要内容 规避命名冲突 匿名函数是一个函数表达式 块级作用域 let、const。可以这样写 { let bar = xxx; } 这是一个块,在闭包中我们可以使用这样的块来释放闭包占用的多余内存。如下 function test() { function process(data){......} var bigD...原创 2018-11-22 22:57:38 · 278 阅读 · 0 评论 -
第四章 提升
var a = 10 会被看作两个部分 var a a = 10 第一个部分是预编译阶段的任务,第二个阶段是执行阶段的任务,而且预编译阶段会将所有的变量进行提升。 如果是函数声明,那么预编译阶段会被赋值,而函数表达式在这个阶段不会被赋值 如果是具名的函数表达式,那么名称标识符不会被提升,例如: foo() // TypeError test() // ReferenceError var...原创 2018-12-13 10:07:33 · 142 阅读 · 0 评论 -
第五章 作用域闭包
当函数可以记住并访问所在的词法作用域,就产生了闭包 循环中闭包问题的解决 for (var i = 0; i <= 5; i++) { setTimeout( function timer () { console.log(i) }, i * 1000) } 这里就涉及到事件的轮询机制。异步事件和同步事件,异步事件会在最后执行。 要解决上面的问题有两种方法,分别是使用立即执行函数和...原创 2018-12-13 11:49:19 · 199 阅读 · 0 评论 -
第二章 this全面解析
在使用call、apply的时候,如果传入了一个原始值,那么会被转会成它的对象形式,例如字符串会被转换成字符串形式 硬绑定 不管是隐式绑定还是显示绑定,都会出现this绑定丢失的问题, 硬绑定就是用来解决this丢失绑定的问题,它是显示绑定的一个变种 var obj = { a: 2 } function foo () { } function bar () { foo.call(obj) ...原创 2018-12-14 16:44:27 · 244 阅读 · 0 评论 -
第三章 对象
如果像对象一样使用数组,通过.语法给数组添加了属性,数组的length属性不会发生改变 给数组添加属性,如果属性名看起来像一个数字,那么它会被当作一个数组下标,思考下面的代码 var myArray = ["foo", 42] myArray["2"] = "baz" // 注意这里 myArray.length // 3 myArray[3] // "baz" 深拷贝: JSON.par...原创 2018-12-16 14:56:15 · 191 阅读 · 0 评论 -
混合对象 类 第四章
类的特性 类是一种设计模式 继承 多态 多重继承 javascript中模拟类的复制行为 分为两种类型的混入,显示、隐士 显式混入 定义一个混入函数mixin,分别接收源对象和要复制到的目标对象 function mixin( sourceObj, targetObj ) { for ( var key in sourceObj ) { if (!( key in targetObj ...原创 2018-12-17 18:35:00 · 214 阅读 · 0 评论 -
第五章 原型[[Prototype]]
属性设置和屏蔽 当执行obj.a这段代码,且a不直接存在于obj上时 如果原型链上不存在a,a就会被直接添加到obj上 如果存在,并且writeable: true,那么也会被直接添加到obj上 如果存在,但是writeable: false,那么即无法修改,也无法创建属性 如果存在,并且它是一个setter,那不管怎么都会调用这个函数 如果希望前面两种情况直接像第二种情况一样屏蔽掉原型链上的a...原创 2018-12-18 22:44:14 · 174 阅读 · 0 评论