本书属于基本类书籍,会有比较多的基本知识,所以这里仅纪录寻常不怎么轻易注重到的知识点,不会全记,供人人和本身翻阅;
上中下三本的读书笔记:
第一部份 作用域和闭包
第二章 词法作用域
词法查找
全局变量会自动成为全局对象(浏览器中是 window
) 的属性,因此是不可以直接经由过程全局对象的此法称号,而是间接地经由过程全局对象属性的运用来对其举行接见 window.a
,经由过程这类要领可以接见那些被同名变量所遮盖的全局变量。然则假如非全局的变量假如被遮盖了,无论如何都没法被接见到。
诳骗词法
假如词法作用域完整由写代码时期函数所性命的位置来定义,那末可以经由过程几种要领来诳骗(修正)词法作用域,比方 eval
、with
然则要注重:诳骗词法作用域会致使机能下落。
由于JS引擎会在编译阶段举行机能优化,个中有些优化依赖于可以依据代码的词法举行静态剖析,并预先确定一切变量和函数的定义位置,才能在实行过程当中疾速找到标识符。然则假如引擎在代码中找到 eval
、with
,就会完整不做任何优化。
第三章 函数作用域和块作用域
函数作用域
包装函数的声明以 function
关键字最先,那末就是函数声明,而下面这个例子是以 (function
最先,那末就是函数表达式:
const a = 1;
function foo() { // 函数声明
const a = 4;
console.log(a);
}
(function foo() { // 函数表达式
const a = 3;
console.log(a);
}())
console.log(a);
所以上面的 IIFE
将会被当作函数表达式而不是一个函数声明来处置惩罚;
函数声明和函数表达式之间最主要的区别是他们的称号标识符会绑定在那边。
函数声明的称号标识符 foo
会被绑定在地点作用域中,可以直接经由过程 foo()
来挪用;而函数表达式的 foo
被绑定在函数表达式只剩的函数中而不是地点作用域中;
同时,即使是签字的函数表达式,称号标识符在赋值之前也没法在地点作用域中运用。
try/catch
构造的 catch
分句中具有块级作用域。
第四章 提拔
编译器
函数声明会被提拔,而函数表达式不会被提拔。
函数优先
函数声明和变量声明都会被提拔,然则函数会起首被提拔,然后才是变量。
foo() // 1
var foo
function foo() {
console.log(1)
}
foo = function() {
console.log(2)
}
函数声明 foo
会起首被提拔,然后打印出 1
,背面的 var
声明会被认为是反复声明而被疏忽;然则注重假如背面涌现同名函数声明,则会掩盖前面的:
foo() // 2
function foo() { console.log(1) }
function foo() { console.log(2) }
第二部份 this和对象原型
第一章 关于this
this究竟是什么
this
现实上是在函数被挪用时发作的绑定,它指向什么完整取决于函数在那里被挪用,并非在编写时绑定。当一个函数被挪用时,会建立一个实行上下文,它包括函数在那里被挪用(挪用栈)、函数的挪用体式格局、传入的参数等信息,this
就是这个纪录的一个属性,会在函数实行的过程当中用到。
推断this
我们可以依据优先级来推断 this
:
- new 绑定: 函数是不是是在
new
中挪用,假如是的话,this
绑定的是新建立的对象;var bar = new foo()
- 显式绑定: 函数是不是经由过程
call
、apply
或许硬绑定挪用,假如是的话,this
绑定的是指定的对象;var bar = foo.call(obj)
- 隐式绑定: 函数是不是在某个上下文对象中挪用,假如是的话
this
绑定的是谁人上下文对象;var bar = obj.foo()
- 默许绑定: 假如都不是的话,在严厉形式下绑定到
undefined
,非严厉形式绑定到全局对象;var bar = foo()
破例
- 被疏忽的状况: 比方把
null
、undefined
作为this
的绑定对象传入call
、apply
、bind
,那末这些值在挪用时会被疏忽,现实运用的是默许绑定; - 箭头函数: 箭头函数依据外层作用域来决议
this
,且箭头函数的绑定没法被修正,new
也不可以;
PS:迎接人人关注我的民众号【前端下午茶】,一同加油吧~
别的可以到场「前端下午茶交换群」微信群,长按辨认下面二维码即可加我挚友,备注加群,我拉你入群~