乐趣区

js基础系列

知识点

从原型到原型链

  • 原型
__proto__:每一个对象都有自己的原型属性,可以叫做隐式原型
prototype:每一个构造函数有自己的原型属性,可以叫做显式原型

那么有一条规则是对象的隐式原型指向构造函数的显式原型,基于这个逻辑就有了下面的原型链示意图

其中构造函数的显式原型也是一个对象,那么应该有其隐式原型指向构造函数的显式原型,这里的构造函数是 Object, 对应图中下面一部分。
此时会有一个终点

console.log(Object.prototype.__proto__ === null) // true

解读

在这一部分的概念中关注以下几点
1.constructor
实例的 constructor 指向其构造函数

function Person() {}
var person = new Person();
console.log(person.constructor === Person); // true

2. 单独说一下 Function
按照前面说的 Function 既是构造函数,本身也属于 js 对象的范畴
那就应该有 Function.__proto__ === Function.prototype

3. 原型链
到这里原型链应该就好理解了,访问实例 a 的属性,假如没有找到就会去原型里找,就像上面的指向流程

作用域

在 es6 之前只有函数作用域和全局作用域的概念,我们主要聊的就是函数作用域

作用域是指程序源代码中定义变量的区域,javascript 采用词法作用域,函数的作用域在函数定义的时候就决定了,确定当前执行代码对变量的访问权限。
这一块看下例子即可

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){return scope;}
    return f();}
checkscope();
var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){return scope;}
    return f;
}
checkscope()();

明白输出的结果,应该就理解了作用域的定义

执行上下文栈

在学习异步知识点的时候,我们知道浏览器是异步单线程,在一次事件循环中会先处理同步事件,入栈出栈,而异步事件会加入到事件队列等待执行。
那这里的执行栈是什么呢?这里涉及到以下概念需要了解

  1. 执行上下文

当 JavaScript 代码执行一段可执行代码时,会创建对应的执行上下文

  • 变量对象(Variable object,VO)
  • 作用域链(Scope chain)
  • this

一个个来认识

变量对象:在当前上下文中定义的变量和函数声明
在具体分析的过程中分为两步,进入执行上下文和代码执行,对于一个函数明确 AO 和 VO 分别是什么。

  1. 作用域链

多个执行上下文的变量对象构成的链表就叫做作用域链,这是在访问变量的时候确定的,那具体的作用域链由什么组成

退出移动版