执行环境的类型有两种:全局执行环境和局部执行环境(函数执行环境)。

1.全局执行环境的变量对象是window对象,是JS代码开始运行时的默认环境。全局执行环境的变量对象始终都是作用域链中的最后一个对象。但是还是有其他办法来延长作用域链。

2.函数执行环境,当某个函数被调用的时候,会先创建一个执行环境及其相应的作用域链,然后使用arguments对象和其他命名参数的值来初始化执行环境的变量对象。

有些语句可以在作用域前端临时增加一个变量对象,该变量对象会在代码执行之后被移除。

两种情况

1.with语句

2.try-catch语句的catch块

当执行流进入上面的任何一个语句时,作用域链就会被加长。

with语句

1.with语句的作用是将代码的作用域设置到一个特定的对象中。目的主要是为了简化多次编写同一个对象的工作。

2.使用with语句可以关联location对象,也就是说,在with语句的代码块内部,每个变量首先会被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,则会查询location对象中是否有同名的属性。如果发现了同名的属性,则以location对象属性的值作为变量的值。

3.严格模式下不允许使用with语句,否则将视为语法错误。

4.with关键字的弊端

  • 性能问题

    使用with关键字后,js引擎不能对这段代码进行优化,,还有就是js压缩工具不能对这段代码进行压缩,这也是影响的一个因素
  • 语义不明,难以调试

    具体可以参考http://luopq.com/2016/02/14/js-with-keyword

5.对with语句来说,会将指定的对象添加到作用域中。

如:

function bulidUrl(){
var qs = "?debug=true"; with(location){//with语句接收的是location对象,因此with语句的变量对象中就包含了location对象的所有属性和方法,然后这个变量对象被添加到作用域的前端。
var url = href + qs;
}
return url;
//当执行流进入buildUrl函数时,它的执行环境中的活动对象就包括arguments对象,with语句中的location对象,qs,url,所以在with语句中定义的url变量可以在with语句外被访问。
}

我的理解:如果你想引用某个指定对象的方法和属性,可以用with语句。这样,这个指定对象就被添加到作用域链的前端。在with语句块中定义的url变量,可以在buildUrl函数作用域中被访问,with语句块只是一个特例(它也有变量对象,即location,当在内部引用href的时候,是因为可以在当前执行环境的变量对象中找到)

注意

IE8及其之前版本的try-catch语句块中,在catch块外面也可以访问到错误对象,因为在catch语句中捕获的错误对象会被添加到执行环境的变量对象,而不是catch语句的变量对象中。IE9修复了这个问题。

JavaScript中的with语句的更多相关文章

  1. JavaScript中:表达式和语句的区别

    JavaScript中:表达式和语句的区别 Javascript语言精粹:表达式是由运算符构成,并运算产生结果的语法结构.程序是由语句构成,语句则是由“:(分号)”分隔的句子或命令.如果在表达式后面加 ...

  2. JavaScript 中表达式和语句的区别

    1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...

  3. Javascript中的Label语句

    在javascript中,我们可能很少会去用到 Label 语句,但是熟练的应用 Label 语句,尤其是在嵌套循环中熟练应用 break, continue 与 Label 可以精确的返回到你想要的 ...

  4. 理解javascript中的for语句

    程序实现中经常要用到循环语句,其中for循环是多数语言都有的.在javascript中,for循环有几种不同的使用情况,下面就分别来讲述我的理解. 第一种:(通常情况,循环执行相关操作) var ob ...

  5. Javascript中表达式和语句的区别

    一.表达式:一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数. 以下例子就是表达式: a=35: b=1+a; a=function (){return 6}: b ...

  6. [译]Javascript中的switch语句

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  7. JavaScript中的label语句,及应用

    label语句:可以在代码中添加标签,以便将来使用. 语法:label : statement 示例: start: for(var i=0;i<10;i++){ console.log(i); ...

  8. [译]javascript中的条件语句

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  9. 浅谈Javascript中的Label语句

    如: begin: for (var i = 0; i < 10 ; i++ ){ alert(i); } 举一个比较典型的例子,看完后即明白 Label 的应用:(未添加 Label) var ...

随机推荐

  1. Coursera在线学习---第七节.支持向量机(SVM)

    一.代价函数   对比逻辑回归与支持向量机代价函数. cost1(z)=-log(1/(1+e-z)) cost0(z)=-log(1-1/(1+e-z)) 二.支持向量机中求解代价函数中的C值相当于 ...

  2. Java开源爬虫框架crawler4j

    花了两个小时把Java开源爬虫框架crawler4j文档翻译了一下,因为这几天一直在学习Java爬虫方面的知识,今天上课时突然感觉全英文可能会阻碍很多人学习的动力,刚好自己又正在接触这个爬虫框架,所以 ...

  3. 跟踪内核启动过程CONFIG_DEBUG_LL【转自】

    转自:http://bbs.chinaunix.net/thread-3642079-1-1.html 最近在调试Linux内核,跟踪启动过程.发现在没有turn on mmu之前,可以使用物理地址, ...

  4. qt-creator

    https://github.com/qt-creator/qt-creator https://github.com/qt-creator

  5. MySQL-5.5.49安装、多实例、主从复制

    源码安装mysql yum install ncurses-devel libaio-devel -y mkdir /server/tools -p cd /server/tools wget htt ...

  6. 小程序css

    样式导入 @import /** common.wxss **/ .small-p { padding:5px; } /** app.wxss **/ @import "common.wxs ...

  7. 《java并发编程实战》读书笔记1--线程安全性,内置锁,重入,状态

    什么是线程安全? 当多个线程访问某个类时,不管这些的线程的执行顺序如何,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 哈哈书上的解释,还是翻译过 ...

  8. SEO优化:WordPress发布文章主动推送到百度,加快收录保护原创

    工作实在太忙,也没时间打理网站.最近公司额外交待了一些网站 SEO 方面的优化任务让我关注(这就是啥都要会.啥都要做的苦逼运维的真实写照了...). 于是抽空看了下百度站长平台,至少看到了2个新消息: ...

  9. 友盟移动开发平台.NET版本SDK

    由于项目需要给安卓.ios提供提送消息服务.找到了umeng这个平台,官方竟然没有提供.net版本的SDK,同时项目需要就拿出来和大家分享一下需要的同学们可以做个参考,建议官方提供.net版本. 这里 ...

  10. C++ 取整数学函数

    C++ 取整数学函数 将浮点数取整或者四舍五入的数据处理情况经常见到,下面做一下总结. 注意:函数取整返回值均为 double 型,在用 printf 输出时应注意. 数学头文件 #include&l ...