重读你不知道的JS (上) 第一节四章

你不知道的JS(上卷)笔记

你不知道的 JavaScript

JavaScript 既是一门充溢吸引力、简朴易用的言语,又是一门具有许多庞杂玄妙手艺的言语,即使是经验丰富的 JavaScript 开发者,假如没有认真学习的话也没法真正明白它们.

上卷包含俩节:

  • 作用域和闭包
  • this 和对象原型

作用域和闭包

愿望 Kyle 对 JavaScript 事情道理每个细节的批判性思 考会渗入到你的思索历程和一样平常事情中。知其然,也要知其所以然。

提拔

作用域同个中的变量声明涌现的位置有某种玄妙的联络

案例1

a = 2;
var a;
console.log( a ); // 在不相识声明提拔的情况下,你能够得出结果是undefined?  现实是2

案例2

console.log( a ); // 你能够因为案例1的影响,得出2,或许未声明便运用,ReferenceError异常,现实上输出 undefined
var a = 2;

看看编译器怎么说:

准确的思索思绪是,包含变量和函数在内的一切声明都邑在任何代码被实行前起首 被处置惩罚。

编译 -> 诠释js代码 -> 实行

只要声明自身会被提拔,而赋值或其他运转逻辑会留在原地。假如提拔改变了代码实行的递次,会形成异常严峻的损坏。

函数声明会被提拔,然则函数表达式却不会被提拔。

foo(); // 不是 ReferenceError, 而是 TypeError!
var foo = function bar() { // ...
};

foo()挪用实行时,foo 此时并没有赋值(假如它是一个函数声明而不 是函数表达式,那末就会赋值)。foo() 因为对 undefined 值举行函数挪用而致使非法操纵, 因而抛出 TypeError 异常。

函数优先

函数声明和变量声明都邑被提拔,然则函数会起首被提拔,然后才是变量。

一个一般块内部的函数声明一般会被提拔到地点作用域的顶部,这个历程不会像下面的代 码暗示的那样能够被前提推断所掌握:

foo(); // "b"
var a = true; 
if (a) {
  function foo() { console.log("a"); }
}
else {
  function foo() { console.log("b"); }
}

小结

我们习气将var a = 2;看做一个声明,而现实上JavaScript引擎并不这么以为。它将var a
和 a = 2 看成两个零丁的声明,第一个是编译阶段的使命,而第二个则是实行阶段的使命。
这意味着不管作用域中的声明涌现在什么地方,都将在代码自身被实行前起首举行处置惩罚。 能够将这个历程抽象地设想成一切的声明(变量和函数)都邑被“挪动”到各自作用域的 最顶端,这个历程被称为提拔。

声明自身会被提拔,而包含函数表达式的赋值在内的赋值操纵并不会提拔。 要注意防止反复声明,特别是当一般的 var 声明和函数声明夹杂在一起的时刻,不然会引起许多风险的题目!

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