文档章节

作用域链(Scope Chain)

KaronChen
 KaronChen
发布于 2015/08/23 01:06
字数 384
阅读 116
收藏 0

问题:

  1. 当函数内部的某些变量或函数既不是函数本身定义的,也不是以形参的方式传入,那执行函数的时候,这些变量是怎么找到的?

知识点:

作用域链

  1. 与执行上下文相关;

  2. 激活函数时完成作用域链的拼接;

  3. 包含活动对象(AO)和该函数内部的[[Scope]]属性。

  4. ECMAScript只使用静态(词法)作用域

---函数创建时的[[Scope]]属性

  1. [[Scope]]属性作为作用域链一部分,在函数创建的时候就被存储于函数对象中,永远不变,直到函数被摧毁;

  2. [[Scope]]属性存放着所有父变量对象的变量和函数;

---函数激活

  1. 此时,在函数执行上下文中有AOthis[[Scope]]。(完成拼接)

  2. 活跃对象AO是作用域链中的第一个对象,会现在这里查找变量;

  3. 一个上下文中的局部变量优先级高于父作用域的变量,如果同名的变量来之不同作用域,第一个被发现的会是在最深作用域中,会被使用;

  4. 变量查找也包括原型链查找,即二维链查找;

  5. 如果存在with声明或者catch语句,则withObject | catchObject(在AO前)为第一对象。但等到with或者catch运行完后,withObject | catchObject会被移除,即其中的相关变量也会被移除。




© 著作权归作者所有

上一篇: 函数(Functions)
下一篇: this
KaronChen
粉丝 8
博文 19
码字总数 9811
作品 0
广州
程序员
私信 提问
Javascript作用域原理(转)

问题的提出 首先看一个例子: 运行结果是什么呢? 上面的问题, 我相信会有很多人会认为是: 因为会以为在echo中, 第一次alert的时候, 会取到全局变量name的值, 而第二次值被局部变量name覆盖, 所...

菜到没谱
2013/01/24
588
2
前端进阶之说一说你对JS上下文栈和作用域链的理解?

作者:陈大鱼头 github: KRISACHAN 链接:github.com/YvetteLau/S… 背景:最近高级前端工程师 刘小夕 在 github 上开了个每个工作日布一个前端相关题的 repo,怀着学习的心态我也参与其中,...

陈大鱼头
06/03
0
0
[JavaScript基础]作用域链和执行上下文

变量对象(函数创建过程生成) 关键字:静态作用域链,AO Javacript是静态作用域链,也就确定了对变量查找的访问权限,是在被定义的时候就确定好的,也就是函数的作用域在函数定义的时候就决...

向布谷鸟说早安
03/03
0
0
图解Javascript上下文与作用域

本文尝试阐述Javascript中的上下文与作用域背后的机制,主要涉及到执行上下文(execution context)、作用域链(scope chain)、闭包(closure)、等概念。 >> 原文 << Execution context 执...

rainyear
2015/07/06
951
7
在Javascript中闭包(Closure)

转至百度百科 在Javascript中闭包(Closure) 一、什么是闭包? “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是...

宋志刚
2011/11/18
57
0

没有更多内容

加载失败,请刷新页面

加载更多

idea 打开一个新的项目,maven都需要重新配置,解决方案

需要有个默认全局配置 File->Other Settings -> Default Settings 将Maven home directory目录修改成我们自定安装Maven的目录...

观海562
27分钟前
4
0
链表中环的入口节点

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路: public ListNode EntryNodeOfLoop(ListNode pHead) { if (pHead == null || pHead.next == null) ...

Garphy
47分钟前
5
0
Spring5 源码分析-容器刷新-invokeBeanFactoryPostProcessors()方法

上一篇:Spring5 源码分析-容器刷新-prepareBeanFactory()方法 该方法主要完成以下功能: 1.实例化ConfigurationClassPostProcessor,并调用ConfigurationClassPostProcessor.postProcessBe...

特拉仔
47分钟前
5
0
为什么MySQL用B+树做索引

索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。...

小致Daddy
今天
8
0
网站前台的三级联动数据封装

我在进行项目时候遇到了一个进行数据封装的一个功能,进行数据的封装的功能也挺复杂,来回试了好几十种方法.最后使用的是这种方法. 使用一个pojo进行封装两个数据,一个是list一个是实体类. 具体...

小天丶羽
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部