关于js with语句的一些理解

原创 2015年07月08日 08:24:50

今天看到js的with语句部分,书中写到,with语句接收的对象会添加到作用域链的前端并在代码执行完之后移除。看到这里,我有两点疑问,添加到作用域链前端是不是指对象会被放置到作用域链的最底部,然后查找变量时最先查找这个对象(按照我的理解,js的作用域链查找变量的过程是一个冒泡的过程,底部开始往上走,找到了就停止冒泡),第二点就是,执行之后移除是不是指with语句之后就移除那个对象。于是写了一个简单的例子来验证一下。

var b = {a:2};

function sayA(){
    var a = 1;
    with(b){alert(a);}
    alert(a);
}

sayA();

代码运行结果是2和1。这证实了我之前的猜想,因为正常情况,位于作用域链底部的应该是函数的局部变量a,然而with语句中的a却是对象b的字段a,这证明对象b占据了作用域链中最底部的位置。而with语句之后的a的值又变成了1,说明对象b已从作用域链最底部移除。我自己认为在with语句中,这时的执行环境就是对象b,而不是函数,所以首先访问b中的a值。

我尝试在函数外直接访问a,结果当然是undefined,因为这时的执行环境应该是全局环境,而全局环境并没有这个a值,只有通过b.a才可以访问b中的a,所以可以这样说with语句其实还提供了简写访问对象字段的途径。假设b中有50个字段,你要全部访问,正常情况你要写50个b.xxx,而使用with语句只要直接写字段名就行了。

然而,我又有了一个疑问,我在with语句中创建一个变量,这个变量究竟属于谁。如果按照我的理解,这个变量应该属于对象b。

var b = {a:2};

function sayA(obj){
    var a = 1;
    with(b){a=5;c = 6;}
    alert(c);
}

sayA();
alert(b.c);
alert(b.a);

但是, 运行结果是6、undefined和5。这说明with语句中的对象并不是作为执行环境添加到作用域链中的,仅仅是作为一个变量添加到with语句所在的执行环境之中,with语句中的变量还是属于with语句所在的执行环境(这里是函数sayA),而对b的字段的改变也会真正影响到b。

总结

  • 在with语句块中,只是改变了对变量的遍历顺序,由原本的从执行环境开始变为从with语句的对象开始。当尝试在with语句块中修改变量时,会搜索with语句的对象是否有该变量,有就改变对象的值,没有就创建,但是创建的变量依然属于with语句块所在的执行环境,并不属于with对象。
  • 离开with语句块后,遍历顺序就会再次变成从执行环境开始。
  • 其实概括来说,和书本所总结的是一致的,with语句接收的对象会添加到作用域链的前端并在代码执行完之后移除。

本人见解,如有错误,欢迎指正。

js的with语句

今天再看一段代码,感觉自已对with的理解很不到位啊,由于with语句在开发中基本不会使用,而且很多书上也不建议使用with来改变函数的作用域,并且在严格模式下with语句是禁用的。var obj =...

博客建站简明攻略+使用Hexo搭建博客经验总结

这是一篇个人总结,不适合用作入门教程; 需要更详细的资料请 点击这里 安装 系统环境 win8.1 64bit 文本编辑器推荐使用 Sublime Text, Hexo的文件编码格式为UTF-...
  • tham_
  • tham_
  • 2015年04月15日 17:04
  • 2043

JS with和this的用法

1、with 语句 为一个或一组语句指定默认对象。 用法:with () ; with 语句通常用来缩短特定情形下必须写的代码量。在下面的例子中,请注意 Math 的重复使用: x = Math.c...

js中的with语句

语法结构: with(object instance)   {           //代码块   }          有时候,我在一个程序代码中,多次需要使用某对象的属性或方法,照以前的...

js作用域(函数作用域、变量作用域、作用域链、with语句)

一:函数作用域先看一小段代码:var scope="global"; function t(){ console.log(scope); var scope="local"...

JS模拟面向对象,对象原型,JSON,with语句,for in 语句

// 定义类,定义函数 function Person () { this.name ="dub"//公有的属性 age = 100;//私有属性 //公有的方法 this.hh = ...

js try、catch、finally语句还有with语句

差不多跟java是一样的,调用顺序是try,catch,finally,当然如果没抛到可以catch的异常,那么catch不会执行。finally语句里的内容是一定会被执行的,即便try里面有retu...
  • dys1990
  • dys1990
  • 2011年10月10日 01:21
  • 3959

理解try-with-resources语句及示例

try-with-resources语句可以对需要关闭的资源实现自动化管理,从而优化代码。
  • frgod
  • frgod
  • 2016年11月30日 22:28
  • 333

如何理解Python的With语句?

With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读...

理解Python的With as语句

文章转自:http://blog.csdn.net/wusuopubupt/article/details/29369601 《Python标准库》上这么一句话: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于js with语句的一些理解
举报原因:
原因补充:

(最多只允许输入30个字)