目录

1.作用域链

2.原型链


1.作用域链

JavaScript 在执⾏过程中会创建一个个的可执⾏上下⽂。 (每个函数执行都会创建这么一个可执行上下文)

每个可执⾏上下⽂的词法环境中包含了对外部词法环境的引⽤,可通过该引⽤来获取外部词法环境中的变量和声明等。

这些引⽤串联起来,⼀直指向全局的词法环境,形成一个链式结构,被称为作⽤域链。

简而言之: 函数内部 可以访问到 函数外部作用域的变量, 而外部函数还可以访问到全局作用域的变量,

这样的变量作用域访问的链式结构, 被称之为作用域链

let num = 1
​
function fn () {let a = 100function inner () {console.log(a)console.log(num)}inner()
}
fn()

下图为由多个可执行上下文组成的调用栈:

  • 栈最底部为全局可执行上下文

  • 全局可执行上下文 之上有多个 函数可执行上下文

  • 每个可执行上下文中包含了指向外部其他可执行上下文的引用,直到 全局可执行上下文 时它指向 null

js全局有全局可执行上下文, 每个函数调用时, 有着函数的可执行上下文, 会入js调用栈

每个可执行上下文, 都有者对于外部上下文词法作用域的引用, 外部上下文也有着对于再外部的上下文词法作用域的引用

=> 就形成了作用域链


2.原型链

要讲清楚这个问题,主要着重这几个方面:

  • 什么是原型对象

  • 构造函数, 原型对象, 实例的三角关系图

  • 原型链如何形成


原型对象

在 JavaScript 中,除去一部分内建函数,绝大多数的函数都会包含有一个叫做 prototype 的属性,指向原型对象,

基于构造函数创建出来的实例, 都可以共享访问原型对象的属性。

例如我们的 hasOwnProperty, toString ⽅法等其实是 Obejct 原型对象的方法,它可以被任何对象当做⾃⼰的⽅法来使⽤。

hasOwnProperty 用于判断, 某个属性, 是不是自己的 (还是原型链上的)

来看一段代码:

let person = { name: "Tom", age: 18, job: "student"
}
​
console.log(person.hasOwnProperty("name")) // true
console.log(person.hasOwnProperty("hasOwnProperty")) // false
console.log(Object.prototype.hasOwnProperty("hasOwnProperty")) // true

可以看到,hasOwnProperty 并不是 person 对象的属性,但是 person 却能调用它。

那么 person 对象是如何找到 Object 原型中的 hasOwnProperty 的呢?这就要靠原型链的能力了。


原型链

在 JavaScript 中,每个对象中都有一个 __proto__ 属性,这个属性指向了当前对象的构造函数的原型。

对象可以通过自身的 __proto__属性与它的构造函数的原型对象连接起来,

而因为它的原型对象也有 __proto__,因此这样就串联形成一个链式结构,也就是我们称为的原型链。

什么是原型链和作用域链?相关推荐

  1. JavaScript中的链(作用域链、原型链)

    JavaScript中的链(作用域链.原型链) Js中存在两种链,作用域链和原型链.作用域链是为了访问变量而存在的链,原型链是访问对象的属性而存在的链. 作用域链 说到作用域链,首先来说下作用域的概念 ...

  2. 【JS】原始值与引用值、执行上下文与作用域链、作用域链增强、变量声明、标识符查找

    1.原始值与引用值 EcmaScript变量可以包含两种不同类型的数据:原始值.引用值 原始值:最简单的数据 引用值:由多个值构成的对象 六种原始值: Undefined Null Boolean N ...

  3. 学习面向对象的Javascript的第一步就是要搞清楚两个东西:原型链和作用域链

    前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...

  4. JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制

    2019独角兽企业重金招聘Python工程师标准>>> 执行环境是JavaScript中最为重要的一个概念,每个执行环境都有一个与之关联的变量对象,执行环境中所有的变量和函数都保存在 ...

  5. JS 总结之函数、作用域链

    在 JavaScript 中,函数实际上是一个对象. ? 声明 JavaScript 用 function 关键字来声明一个函数: function fn () {} 复制代码 变体:函数表达式: v ...

  6. js原型、原型链、作用链、闭包全解

    https://www.2cto.com/kf/201711/698876.html [对象.变量] 一个对象就是一个类,可以理解为一个物体的标准化定义.它不是一个具体的实物,只是一个标准.而通过对象 ...

  7. 你还要我怎样的JS系列(4) -- 作用域链

    前言 上一章节我们讲了VO. 我们回顾一下之前的内容. 进入执行上下文会创建VO对象.建立作用域链.确定this指向.执行上下文的数据(函数形参.变量声明.函数声明)是作为属性存储在VO中的. 我们也 ...

  8. 使用变量对象引出作用域链

    <script type="text/javascript"> var name="xm"; //全局变量,window.name===name;  ...

  9. 对javascript作用域链的理解

    这几天学习了一下javascript作用域链,感到这个挺重要的,所以写一篇文章分享一下: 1. 作用域链: 当代码在一个环境中执行时,会创建由变量对象构成的一个作用域链.作用域链的用途是:保证对执行环 ...

最新文章

  1. 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)
  2. Windows核心编程 第五章 作业(上)
  3. JDK中提供的实现——通过 java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例
  4. 互联网思维与非摩擦经济
  5. excel取整函数_Excel中的这些烧脑问题,你遇到过几种?
  6. PHP结合Ueditor并修改图片上传路径
  7. Frida基础操作命令
  8. 那一年,爱因斯坦输得很惨很惨,被十几个诺奖得主怼了一遍后,退出了群聊……...
  9. 九大经典算法之归并排序
  10. MPAndroidChart绘制图形表
  11. 仿原生app,native特效
  12. 方正璞华研发的社保股权管理系统初见成效
  13. 微信视频号视频如何下载保存?教你批量下载保存视频号视频到手机相册
  14. The AudioContext was not allowed to start. It must be resumed after a user gesture on the page
  15. 强化学习——Proximal Policy Optimization Algorithms
  16. IE8的调试工具使用详解(下)
  17. 《数据结构与算法之二叉平衡树(AVL)》
  18. Markdown 脚注 记录
  19. 现代计算机控制理论及应用王万良 pdf,计算机}j现代化.PDF
  20. 【C语言】自定义类型 结构体 枚举 联合

热门文章

  1. 异常检测 Anomaly Detection研究进展梳理
  2. “Missing essential plugin: org.jetbrains.android……”
  3. 从产品经理人角度分析心理测试系统
  4. java native内存_JVM参数之NativeMemoryTracking
  5. java中的js是什么意思_什么是JavaScript
  6. 爱情表白html,爱情表白词大全
  7. SCADA平台在风电场测量的应用,实现风电场的高效管理
  8. 保护眼睛什么光的灯最好?推荐优秀的全光谱护眼台灯
  9. 电脑永久删除的文件怎么恢复?这个可以帮到你
  10. performClick 默认点击