《你不知道的JavaScript》 (上) 浏览择要

本书属于基本类书籍,会有比较多的基本知识,所以这里仅纪录寻常不怎么轻易注重到的知识点,不会全记,供人人和本身翻阅;

上中下三本的读书笔记:

  1. 《你不知道的JavaScript》 (上) 读书笔记
  2. 《你不知道的JavaScript》 (中) 读书笔记
  3. 《你不知道的JavaScript》 (下) 读书笔记

第一部份 作用域和闭包

第二章 词法作用域

词法查找

全局变量会自动成为全局对象(浏览器中是 window) 的属性,因此是不可以直接经由过程全局对象的此法称号,而是间接地经由过程全局对象属性的运用来对其举行接见 window.a,经由过程这类要领可以接见那些被同名变量所遮盖的全局变量。然则假如非全局的变量假如被遮盖了,无论如何都没法被接见到。

诳骗词法

假如词法作用域完整由写代码时期函数所性命的位置来定义,那末可以经由过程几种要领来诳骗(修正)词法作用域,比方 evalwith 然则要注重:诳骗词法作用域会致使机能下落

由于JS引擎会在编译阶段举行机能优化,个中有些优化依赖于可以依据代码的词法举行静态剖析,并预先确定一切变量和函数的定义位置,才能在实行过程当中疾速找到标识符。然则假如引擎在代码中找到 evalwith ,就会完整不做任何优化。

第三章 函数作用域和块作用域

函数作用域

包装函数的声明以 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

  1. new 绑定: 函数是不是是在 new 中挪用,假如是的话, this 绑定的是新建立的对象;

    var bar = new foo()

  2. 显式绑定: 函数是不是经由过程 callapply 或许硬绑定挪用,假如是的话,this 绑定的是指定的对象;

    var bar = foo.call(obj)

  3. 隐式绑定: 函数是不是在某个上下文对象中挪用,假如是的话 this 绑定的是谁人上下文对象;

    var bar = obj.foo()

  4. 默许绑定: 假如都不是的话,在严厉形式下绑定到 undefined ,非严厉形式绑定到全局对象;

    var bar = foo()

破例

  1. 被疏忽的状况: 比方把 nullundefined 作为 this 的绑定对象传入 callapplybind ,那末这些值在挪用时会被疏忽,现实运用的是默许绑定;
  2. 箭头函数: 箭头函数依据外层作用域来决议 this,且箭头函数的绑定没法被修正,new 也不可以;

PS:迎接人人关注我的民众号【前端下午茶】,一同加油吧~

《《你不知道的JavaScript》 (上) 浏览择要》

别的可以到场「前端下午茶交换群」微信群,长按辨认下面二维码即可加我挚友,备注加群,我拉你入群~

《《你不知道的JavaScript》 (上) 浏览择要》

    原文作者:SHERlocked93
    原文地址: https://segmentfault.com/a/1190000017812755
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞