原型 原型链 作用域链

吾日三省吾身,见不贤而内自省也

 

原型:
所有函数都有一个prototype属性,这个对象就是原型。
所有引用类型的__proto__属性都指向它的构造函数的prototype。

原型链:
当访问对象的某个属性时,先查找对象本身是否存在该属性,如果没有找到就去它的隐式原型__proto__(即构造函数的prototype)上查找,
如果没有找到再去构造函数的prototype的__proto__上查找,这样一层一层向上查找形成的链式结构就是原型链,终点是null。
 
作用域链:

JavaScript 的作用域链是由词法作用域规则(也叫静态作用域)决定的,它是一个由变量对象组成的链表,用于确定在执行代码时查找变量的顺序。当函数被创建时,它会保存对其父级作用域的引用,从而形成了作用域链。以下是 JavaScript 作用域链的一些关键概念:

  1. 词法作用域:

    • JavaScript 使用词法作用域,即变量的作用域是在代码编写时确定的,而不是在运行时。这与动态作用域不同,动态作用域是在运行时根据函数的调用链确定的。
  2. 作用域链的构建:

    • 在函数创建时,JavaScript 引擎会创建一个变量对象(VO),其中包含了该函数的局部变量和参数。然后,引擎将这个变量对象添加到作用域链的头部。
    • 如果函数嵌套在另一个函数内,内部函数的作用域链会包含对外部函数变量对象的引用,依此类推,形成了一条作用域链。
  3. 变量查找过程:

      • 在执行函数内部代码时,JavaScript 引擎首先查找当前函数的变量对象,如果找不到变量,就会顺着作用域链向上查找。
      • 这个查找过程会一直进行,直到找到变量或达到全局作用域。如果在全局作用域中仍然找不到,引擎会抛出 ReferenceError
     
posted @ 2021-05-20 21:17  国服第一李师师  阅读(43)  评论(0编辑  收藏  举报