1

知识点

从原型到原型链

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

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

其中构造函数的显式原型也是一个对象,那么应该有其隐式原型指向构造函数的显式原型,这里的构造函数是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. 作用域链

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


currygolden
31 声望1 粉丝

人生如逆旅,我亦是行人


« 上一篇
vue指令,插件
下一篇 »
模块化解读