什么是原型链和作用域链?
目录
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__
,因此这样就串联形成一个链式结构,也就是我们称为的原型链。
什么是原型链和作用域链?相关推荐
- JavaScript中的链(作用域链、原型链)
JavaScript中的链(作用域链.原型链) Js中存在两种链,作用域链和原型链.作用域链是为了访问变量而存在的链,原型链是访问对象的属性而存在的链. 作用域链 说到作用域链,首先来说下作用域的概念 ...
- 【JS】原始值与引用值、执行上下文与作用域链、作用域链增强、变量声明、标识符查找
1.原始值与引用值 EcmaScript变量可以包含两种不同类型的数据:原始值.引用值 原始值:最简单的数据 引用值:由多个值构成的对象 六种原始值: Undefined Null Boolean N ...
- 学习面向对象的Javascript的第一步就是要搞清楚两个东西:原型链和作用域链
前言 JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型. 虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大.实 ...
- JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制
2019独角兽企业重金招聘Python工程师标准>>> 执行环境是JavaScript中最为重要的一个概念,每个执行环境都有一个与之关联的变量对象,执行环境中所有的变量和函数都保存在 ...
- JS 总结之函数、作用域链
在 JavaScript 中,函数实际上是一个对象. ? 声明 JavaScript 用 function 关键字来声明一个函数: function fn () {} 复制代码 变体:函数表达式: v ...
- js原型、原型链、作用链、闭包全解
https://www.2cto.com/kf/201711/698876.html [对象.变量] 一个对象就是一个类,可以理解为一个物体的标准化定义.它不是一个具体的实物,只是一个标准.而通过对象 ...
- 你还要我怎样的JS系列(4) -- 作用域链
前言 上一章节我们讲了VO. 我们回顾一下之前的内容. 进入执行上下文会创建VO对象.建立作用域链.确定this指向.执行上下文的数据(函数形参.变量声明.函数声明)是作为属性存储在VO中的. 我们也 ...
- 使用变量对象引出作用域链
<script type="text/javascript"> var name="xm"; //全局变量,window.name===name; ...
- 对javascript作用域链的理解
这几天学习了一下javascript作用域链,感到这个挺重要的,所以写一篇文章分享一下: 1. 作用域链: 当代码在一个环境中执行时,会创建由变量对象构成的一个作用域链.作用域链的用途是:保证对执行环 ...
最新文章
- 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)
- Windows核心编程 第五章 作业(上)
- JDK中提供的实现——通过 java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例
- 互联网思维与非摩擦经济
- excel取整函数_Excel中的这些烧脑问题,你遇到过几种?
- PHP结合Ueditor并修改图片上传路径
- Frida基础操作命令
- 那一年,爱因斯坦输得很惨很惨,被十几个诺奖得主怼了一遍后,退出了群聊……...
- 九大经典算法之归并排序
- MPAndroidChart绘制图形表
- 仿原生app,native特效
- 方正璞华研发的社保股权管理系统初见成效
- 微信视频号视频如何下载保存?教你批量下载保存视频号视频到手机相册
- The AudioContext was not allowed to start. It must be resumed after a user gesture on the page
- 强化学习——Proximal Policy Optimization Algorithms
- IE8的调试工具使用详解(下)
- 《数据结构与算法之二叉平衡树(AVL)》
- Markdown 脚注 记录
- 现代计算机控制理论及应用王万良 pdf,计算机}j现代化.PDF
- 【C语言】自定义类型 结构体 枚举 联合
热门文章
- 异常检测 Anomaly Detection研究进展梳理
- “Missing essential plugin: org.jetbrains.android……”
- 从产品经理人角度分析心理测试系统
- java native内存_JVM参数之NativeMemoryTracking
- java中的js是什么意思_什么是JavaScript
- 爱情表白html,爱情表白词大全
- SCADA平台在风电场测量的应用,实现风电场的高效管理
- 保护眼睛什么光的灯最好?推荐优秀的全光谱护眼台灯
- 电脑永久删除的文件怎么恢复?这个可以帮到你
- performClick 默认点击