JavaScript中的with语句
执行环境的类型有两种:全局执行环境和局部执行环境(函数执行环境)。
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语句的更多相关文章
- JavaScript中:表达式和语句的区别
JavaScript中:表达式和语句的区别 Javascript语言精粹:表达式是由运算符构成,并运算产生结果的语法结构.程序是由语句构成,语句则是由“:(分号)”分隔的句子或命令.如果在表达式后面加 ...
- JavaScript 中表达式和语句的区别
1.语句和表达式 JavaScript中的表达式和语句是有区别的.一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数.下面的每行代码都是一个表达式: myvar3 + ...
- Javascript中的Label语句
在javascript中,我们可能很少会去用到 Label 语句,但是熟练的应用 Label 语句,尤其是在嵌套循环中熟练应用 break, continue 与 Label 可以精确的返回到你想要的 ...
- 理解javascript中的for语句
程序实现中经常要用到循环语句,其中for循环是多数语言都有的.在javascript中,for循环有几种不同的使用情况,下面就分别来讲述我的理解. 第一种:(通常情况,循环执行相关操作) var ob ...
- Javascript中表达式和语句的区别
一.表达式:一个表达式会产生一个值,它可以放在任何需要一个值的地方,比如,作为一个函数调用的参数. 以下例子就是表达式: a=35: b=1+a; a=function (){return 6}: b ...
- [译]Javascript中的switch语句
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- JavaScript中的label语句,及应用
label语句:可以在代码中添加标签,以便将来使用. 语法:label : statement 示例: start: for(var i=0;i<10;i++){ console.log(i); ...
- [译]javascript中的条件语句
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 浅谈Javascript中的Label语句
如: begin: for (var i = 0; i < 10 ; i++ ){ alert(i); } 举一个比较典型的例子,看完后即明白 Label 的应用:(未添加 Label) var ...
随机推荐
- ThinkPHP5 模型 - 事务支持
使用事务之前,先确保数据库的存储引擎支持事务操作. MyISAM:不支持事务,主要用于读数据提高性能 InnoDB:支持事务.行级锁和并发 Berkeley DB:支持事务 ThinkPHP5 使用事 ...
- libsensor
https://github.com/easyiot-china/libsensor https://github.com/adafruit/DHT-sensor-library https://gi ...
- Queue类
1.LinkedBlockingQueue:基于链接节点的可选限定的blocking queue . 这个队列排列元素FIFO(先进先出). 队列的头部是队列中最长的元素. 队列的尾部是队列中最短时间 ...
- 【LabVIEW技巧】策略模式
前言 在之前的文章提到了如何学习OOP以及对应的简单工厂模式,由于时间比较长,我们先回顾一下原有内容,然后继续了解新的模式. 为什么学习OOP 在测控系统的软件开发过程中,LabVIEW工程师一直认为 ...
- tornado样板
python tornado 样版 (包含出错页面) 2018-02-27 13:07:30 1 # -*- coding:utf-8 -*- 2 3 import tornado.web 4 i ...
- 使用js创建select option
var v_select = document.getElementById("selectA"); var v_option = document.createElement( ...
- 利用BeanUtils工具类封装表单数据
一.BeanUtils工具类的使用 1.首先导入BeanUtils工具类的jar包 commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar 2.se ...
- mysql设置服务器编码
今天写java程序的时候出现了插入mysql数据中文乱码问题,确定数据库和表的编码都已指定utf-8.百度后得知mysql安装后需设置服务器编码,以下是解决方法(ubuntu; mysql 5.6.2 ...
- php之trait-实现多继承
PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait ...
- websocket小荔枝
关于websocket原理和好处请参考百度,这里只是代码. var ws = new WebSocket('ws://echo.websocket.org/'); ws.onopen = functi ...