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底层原理作用域和作用域链相关推荐

  1. js数组获取index_想自学JS吗?想提升JS底层原理吗?76张脑图带你彻底搞懂原生JS...

    本篇内容适用于:初学前端:及工作时间不久想回顾基础的各位伙伴: 文章主要由图片组成,看起来可能会不太方便,适合保存下来单张查看: 既然来了,就看看在走吧,总会有些收获的: 一.前端发展史 二.JS基础 ...

  2. 【dubbo源码解析】--- dubbo中Invoker嵌套调用底层原理

    本文对应源码地址:https://github.com/nieandsun/dubbo-study 文章目录 1 dubbo中Invoker的重要性 2 dubbo RPC链条中代理对象的底层逻辑 2 ...

  3. this指向-作用域、作用域链-预解析 变量提升-Vue组件传值 父子 子父 非父子-Vue数据双向绑定原理

    目录 this指向 作用域.作用域链 预解析 变量提升 Vue组件传值 父子 子父 非父子 Vue数据双向绑定原理 1.this指向 函数的this指向 看调用.不看声明 (1)普通函数调用 ①函数名 ...

  4. JS原型链与instanceof底层原理

    转载自  JS原型链与instanceof底层原理 一.问题: instanceof 可以判断一个引用是否属于某构造函数: 另外,还可以在继承关系中用来判断一个实例是否属于它的父类型. 老师说:ins ...

  5. js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象

    js 闭包作用域和作用域链 最近,我们想创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系. 最初,我们只是在领域类中引入依赖关系,但这使得无法在测试中控制其值 ...

  6. Js中的作用域和作用域链

    Js中的作用域和作用域链 前言 阅读本文,请先阅读:Js中的函数相关:创建函数的三种方式.函数的形参和实参.返回值.return.break.continue的区别.重载和arguments.匿名函数 ...

  7. 详解JS 作用域与作用域链

    作用域和作用域链方面的知识是JS的重点,去面试十个有八个都会问你这块的知识,所以说这块是特别特别的重要,下面我们好好理解一下作用域和作用域链到底是个什么: 先上一段代码: var a = 'jack' ...

  8. JS 作用域和作用域链

    作用域 JavaScript 中的作用域是我们可以有效访问变量或函数的区域.作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 有两种类型的作用域:全局作用域.局 ...

  9. 深入理解JS作用域和作用域链

    作用域(scope) 1.什么是作用域 概念:作用域是在程序运行时代码中的某些特定部分中变量.函数和对象的可访问性. 从使用方面来解释,作用域就是变量的使用范围,也就是在代码的哪些部分可以访问这个变量 ...

  10. JS作用域与作用域链附测试题

    分类 全局作用域 函数作用域 块级作用域(ES6之后) 作用 隔离变量,不同作用域下同名变量不会有冲突 作用域与执行上下文 区别 – 除全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时 ...

最新文章

  1. 微信小程序——获取所有资讯接口数据
  2. java mkdir()和mkdirs()区别
  3. 如何将pdf导出html,如何导出PDF版、导出EXE版、导出HTML离线版?
  4. HTTP权威指南-概述
  5. hdoj1159:Common Subsequence(dp基础题-最长公共子序列LCS)
  6. BZOJ4659 Lcm
  7. vs2010启动越来越慢解决方法
  8. wacom数位板怎么调压感_怎么设置PS的画笔利用到数位板压感?
  9. [noip2014]解方程 hash+秦九昭
  10. IBM智慧商务 - IBM和SugarCRM携手提供全方位渠道客户体验
  11. 5款最好的安卓界面设计工具推荐
  12. multiset用法详解
  13. U盘中毒文件都不见了
  14. NETDMIS5.0位置度评价案例1
  15. Vscode中搜索字符串失败,报错“Spawn ${path}\ressources\app\node_module.asar.unpacked\vs-code-ripgrep\bin\rg.exe“
  16. ArrayDeque集合的妙用
  17. 哪有那么多BAT的逆袭?
  18. Ubuntu16.04 安装字体教程
  19. CAD 2008英文版下载(含注册机)
  20. 李佳琦10月24日美妆节预告,李家琦双十一预告每日更新

热门文章

  1. 【Linux云计算架构:第二阶段-Linux必会的20多种服务】第22章——-源码编译安装LAMP
  2. mysql mtq_mysql重点词汇 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
  3. cocoscreator1.52 删除anysdk
  4. android手机电池寿命,真正有效延长手机电池寿命的几点建议(iPhone+安卓)
  5. xpath prase string
  6. iOS11 增加的新技能
  7. 相律公式表达式_第六章 相平衡主要公式及其适用条件
  8. 为构建大型复杂系统而生的微服务框架 Erda Infra
  9. 7.13 编程序,比较字符串大小。
  10. 微分与导数之一,切线