__proto__: 每个对象都有本身的原型属性,能够叫作隐式原型 prototype: 每个构造函数有本身的原型属性,能够叫作显式原型
那么有一条规则是对象的隐式原型指向构造函数的显式原型,基于这个逻辑就有了下面的原型链示意图javascript
其中构造函数的显式原型也是一个对象,那么应该有其隐式原型指向构造函数的显式原型,这里的构造函数是Object,对应图中下面一部分。
此时会有一个终点java
console.log(Object.prototype.__proto__ === null) // true
在这一部分的概念中关注如下几点
1.constructor
实例的constructor 指向其构造函数es6
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()();
明白输出的结果,应该就理解了做用域的定义this
在学习异步知识点的时候,咱们知道浏览器是异步单线程,在一次事件循环中会先处理同步事件,入栈出栈,而异步事件会加入到事件队列等待执行。
那这里的执行栈是什么呢?这里涉及到如下概念须要了解spa
当 JavaScript 代码执行一段可执行代码时,会建立对应的执行上下文prototype
一个个来认识
变量对象: 在当前上下文中定义的变量和函数声明
在具体分析的过程当中分为两步,进入执行上下文和代码执行,对于一个函数明确AO和VO分别是什么。
多个执行上下文的变量对象构成的链表就叫作做用域链,这是在访问变量的时候肯定的,那具体的做用域链由什么组成