js底层原理作用域和作用域链
1、作用域([[scope]])
- [[scope]]:每一个js函数都是一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供js引擎存取,[[scope]]就是其中的一个。[[scope]]指的是我们所说的作用域(作用域链),其中存储了运行期期上下文的集合。每一个函数都有一个作用域。
- 运行期上下文:当函数执行的过程之前,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行对应执行期上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文,当函数执行完毕,它所产生的执行期上下文会被销毁。
- 看不懂概念不要紧,可以看下面的例子,然后看概念就会理解。
- 如果不知道执行期上下文的可以看:
https://blog.csdn.net/weixin_44588495/article/details/86616034
2、作用域链
- [[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。
3、要知道
function Person(){}
console.log(Person.name);
console.log(Person.prototype);
- 这里的Person.name等就是可以访问的,但是Person.[[scope]]就是我们访问不到的。
- 这里每次调用都会产生一个新的AO对象。
function test(){}test() -> 产生一个AO{} 用完销毁test() -> 产生一个AO{} 用完销毁
3、例子
function a(){function b(){var b = 234;}var a = 123;b();
}var glob = 100;a();
- a函数定义时,产生了一个[[scope]],这里实际上只有一个GO,全局的作用域。
- a在要执行之前,产生了一个执行期上下文。在这里,新创建的AO是作用域的顶端,我们在查找变量的时候就是沿着作用域链去查找变量,从顶端开始。这也就是为什么,在函数调用时,先查找自己是否含有这个属性,如果没有这个属性就去父级查找,这就是原理。这就是a函数的作用域链了。可以理解为[[scope]]为一个数组。函数本身的预编译形成AO永远是放在最顶端。
- 由于a函数的执行内部执行b(),所以b函数只在执行之前又产生了一个执行期上下文。所以b的作用域链直接基于a的作用域链。
- b函数被创建时的作用域环境:
- b()执行之前进行预编译,形成的作用域链。
- 当b函数查找变量的时候,自顶向下查找变量。
这里是为下一篇闭包铺垫理论知识。
js底层原理作用域和作用域链相关推荐
- js数组获取index_想自学JS吗?想提升JS底层原理吗?76张脑图带你彻底搞懂原生JS...
本篇内容适用于:初学前端:及工作时间不久想回顾基础的各位伙伴: 文章主要由图片组成,看起来可能会不太方便,适合保存下来单张查看: 既然来了,就看看在走吧,总会有些收获的: 一.前端发展史 二.JS基础 ...
- 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理
本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...
- this指向-作用域、作用域链-预解析 变量提升-Vue组件传值 父子 子父 非父子-Vue数据双向绑定原理
目录 this指向 作用域.作用域链 预解析 变量提升 Vue组件传值 父子 子父 非父子 Vue数据双向绑定原理 1.this指向 函数的this指向 看调用.不看声明 (1)普通函数调用 ①函数名 ...
- JS原型链与instanceof底层原理
转载自 JS原型链与instanceof底层原理 一.问题: instanceof 可以判断一个引用是否属于某构造函数: 另外,还可以在继承关系中用来判断一个实例是否属于它的父类型. 老师说:ins ...
- js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象
js 闭包作用域和作用域链 最近,我们想创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系. 最初,我们只是在领域类中引入依赖关系,但这使得无法在测试中控制其值 ...
- Js中的作用域和作用域链
Js中的作用域和作用域链 前言 阅读本文,请先阅读:Js中的函数相关:创建函数的三种方式.函数的形参和实参.返回值.return.break.continue的区别.重载和arguments.匿名函数 ...
- 详解JS 作用域与作用域链
作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下作用域和作用域链到底是个什么: 先上一段代码: var a = 'jack' ...
- JS 作用域和作用域链
作用域 JavaScript 中的作用域是我们可以有效访问变量或函数的区域.作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 有两种类型的作用域:全局作用域.局 ...
- 深入理解JS作用域和作用域链
作用域(scope) 1.什么是作用域 概念:作用域是在程序运行时代码中的某些特定部分中变量.函数和对象的可访问性. 从使用方面来解释,作用域就是变量的使用范围,也就是在代码的哪些部分可以访问这个变量 ...
- JS作用域与作用域链附测试题
分类 全局作用域 函数作用域 块级作用域(ES6之后) 作用 隔离变量,不同作用域下同名变量不会有冲突 作用域与执行上下文 区别 – 除全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时 ...
最新文章
- 微信小程序——获取所有资讯接口数据
- java mkdir()和mkdirs()区别
- 如何将pdf导出html,如何导出PDF版、导出EXE版、导出HTML离线版?
- HTTP权威指南-概述
- hdoj1159:Common Subsequence(dp基础题-最长公共子序列LCS)
- BZOJ4659 Lcm
- vs2010启动越来越慢解决方法
- wacom数位板怎么调压感_怎么设置PS的画笔利用到数位板压感?
- [noip2014]解方程 hash+秦九昭
- IBM智慧商务 - IBM和SugarCRM携手提供全方位渠道客户体验
- 5款最好的安卓界面设计工具推荐
- multiset用法详解
- U盘中毒文件都不见了
- NETDMIS5.0位置度评价案例1
- Vscode中搜索字符串失败,报错“Spawn ${path}\ressources\app\node_module.asar.unpacked\vs-code-ripgrep\bin\rg.exe“
- ArrayDeque集合的妙用
- 哪有那么多BAT的逆袭?
- Ubuntu16.04 安装字体教程
- CAD 2008英文版下载(含注册机)
- 李佳琦10月24日美妆节预告,李家琦双十一预告每日更新
热门文章
- 【Linux云计算架构:第二阶段-Linux必会的20多种服务】第22章——-源码编译安装LAMP
- mysql mtq_mysql重点词汇 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
- cocoscreator1.52 删除anysdk
- android手机电池寿命,真正有效延长手机电池寿命的几点建议(iPhone+安卓)
- xpath prase string
- iOS11 增加的新技能
- 相律公式表达式_第六章 相平衡主要公式及其适用条件
- 为构建大型复杂系统而生的微服务框架 Erda Infra
- 7.13 编程序,比较字符串大小。
- 微分与导数之一,切线