知识点
从原型到原型链
- 原型
__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()();
明白输出的结果,应该就理解了作用域的定义
执行上下文栈
在学习异步知识点的时候,我们知道浏览器是异步单线程,在一次事件循环中会先处理同步事件,入栈出栈,而异步事件会加入到事件队列等待执行。
那这里的执行栈是什么呢?这里涉及到以下概念需要了解
- 执行上下文
当 JavaScript 代码执行一段可执行代码时,会创建对应的执行上下文
- 变量对象(Variable object,VO)
- 作用域链(Scope chain)
- this
一个个来认识
变量对象:在当前上下文中定义的变量和函数声明
在具体分析的过程中分为两步,进入执行上下文和代码执行,对于一个函数明确 AO 和 VO 分别是什么。
- 作用域链
多个执行上下文的变量对象构成的链表就叫做作用域链,这是在访问变量的时候确定的,那具体的作用域链由什么组成