文档章节

JavaScript执行环境及作用域(二)——延长作用域链

Bob2100
 Bob2100
发布于 2018/12/09 08:30
字数 599
阅读 14
收藏 2

虽然执行环境的类型总共只有两种——全局和局部(函数),但还是有办法来延长作用域链的,这么说是因为有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。在两种情况下会发生这种现象。具体来说,就是当执行流进入下列任何语句时,作用域链就会得到加长:

  1. try-catch语句的catch块。
  2. with语句。

这两个语句都会在作用域链的前端添加一个变量对象。对with语句来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。下面看一个例子:

var mother = {
    name: 'Rose',
    age: 30
}

function father(){
    var fName = 'Jack';
    var name = '张三';

    function son(){
        var sName = 'son';
        with(mother){
            var word = 'my name: ' + sName + ', father name: ' + fName +
                ', mother name: ' + name + ", mother age: " + age;
        }
        console.log(word);//my name: son, father name: Jack, mother name: Rose, mother age: 30
    }
    son();
}
father();

首先声明一个对象mother,包含两个属性:nameage,然后定义一个函数father,里面声明两个变量:fNamename,又声明一个函数sonson中定义了一个变量sName和一个with语句块。我们来看打印的结果,mother name为对象mother中的Rose,而不是函数father中的张三,这就是with语句在起作用。

在Chrome中调试可以发现,如下图:

代码执行到19行with语句块中时,作用域链的前端增加了一个With Block作用域,根据作用域链搜索机制,此时的name应该是Rose

再看下图:

代码执行到22行,with语句块执行结束,with作用域从作用域链中移除,with语句块中声明的变量绑定在with所在的函数中,所以console.log(word)可以正常输出word

© 著作权归作者所有

共有 人打赏支持
Bob2100
粉丝 23
博文 85
码字总数 46053
作品 0
浦东
高级程序员
私信 提问
DOM笔记(八):JavaScript执行环境和垃圾收集

一、执行环境 在有关于JavaScript对象或者this的指向问题时,脱离不了的另外一个概念就是执行环境,即上下文环境。执行环境在JavaScript是一个 很重要的概念,因为它定义了变量或函数有权访问...

dwqs
2014/12/16
0
0
JS 底蕴之 变量、作用域和垃圾回收

基本类型和引用类型 在 JavaScript 中,数据类型可分为基本类型和引用类型, 基本类型有六种:Null,Undefined,String,Boolean,Number,Symbol; 而引用类型就是传说中的 Object 了。 其中...

Fly_001
2018/05/23
0
0
深入ECMAScript系列(三):闭包

对词法环境和执行上下文不太了解的朋友,建议先阅读系列文章的前两篇,有助于理解本文,链接 -> 深入ECMAScript系列目录地址(持续更新中...) 一、词法作用域 首先我们来看一个例子(来自冴...

Logan70
2018/12/11
0
0
JavaScript执行环境及作用域(三)——没有块级作用域

JavaScript中没有块级作用域经常会导致理解上的困惑,在其他类C的语言中,由花括号封闭的代码都有自己的作用域,因而支持根据条件来定义变量。但是在JavaScript中下面的代码并不会得到想象中...

Bob2100
2018/12/16
0
0
傻傻分不清的javascript运行机制

学习到javascript的运行机制时,有几个概念经常出现在各种文章中且容易混淆。Execution Context(执行环境或执行上下文),Context Stack (执行栈),Variable Object(VO: 变量对象),Active Ob...

不做祖国的韭菜
2018/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— Im fine

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @LuckyXu:分享戴荃的单曲《小荃拳之歌》: 手机党少年们想听歌,请使劲儿戳(这里) 今天遇到倒霉事了, @ FalconChen :电梯宕机了我靠 但是...

小小编辑
12分钟前
6
4
【转载】uclibc和glibc的差别

转载自:http://blog.163.com/huangnan0727@126/blog/static/30626184201042022011225/ CC的标准库,就是glibc这个库,里面有GCC各种标准函数的实现,还有各种unix系的函数在里面。 当初创建...

shzwork
21分钟前
0
0
关于360插件化Replugin Activity动态修改父类的字节码操作

近期在接入360插件化方案Replugin时,发现出现崩溃情况。 大概崩溃内容如下: aused by: java.lang.ClassNotFoundException: Didn't find class "x.x.x.xActivity" on path: 我自己在插件代码......

Gemini-Lin
今天
1
0
mybatis缓存的装饰器模式

一般在开发生产中,对于新需求的实现,我们一般会有两种方式来处理,一种是直接修改已有组件的代码,另一种是使用继承方式。第一种显然会破坏已有组件的稳定性。第二种,会导致大量子类的出现...

算法之名
昨天
21
0
单元测试

右键方法 Go To --> Test,简便快速生成测试方法。 相关注解 @RunWith(SpringRunner.class) 表示要在测试环境中跑,底层实现是 jUnit测试工具。 @SpringBootTest 表示启动整个 Spring工程 @A...

imbiao
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部