转自:http://lllt.iteye.com/blog/1246424

《Javascript高级程序设计(第二版)》第66页中提到:“由于with语句的变量对象是只读的,结果url就成了函数执行环境的一部分,因而可以作为函数的值被返回。”,不知道谁看完觉得一头雾水?

首先来看看他举的例子:

Js代码  
function buildUrl(){  var qs="?debug=true";  with(location){  var url=href+qs;  }  return url;
}
var result=buildUrl();  alert(result);

  

如果你没读过着本书,并且需要学习javascript,请思考并尝试运行该例子。

最后弹出的不是undefined,而是你的静态页地址+qs的值。

来看一下with语句的作用:

通俗的说,就是引用对象,并对该对象上的属性进行操作,其作用是可以省略重复书写该对象名称,起到简化书写的作用。

但是有几个问题需要注意:

1、with代码块中,javascript引擎对变量的处理方式是:先查找是不是该对象的属性,如果是,则停止。如果不是继续查找是不是局部变量。(在《Javascript高级程序设计(第二版)》中提到的观点,跟这一点恰好相反,但是实例可证明其是错误的,会在接下来介绍)

2、就算在with语句中使用 var 运算符重新定义变量(该变量是with引用对象的属性),如果该属性是可写属性,那么也会给对象的属性赋值。

3、如果你想通过with语句,对引用对象添加多个属性,并为每个属性赋值,这是不可能的!也就是说,要赋值的只能是对象已经存在并且可以写入的属性(不能是只读属性)。

再来看看开头提到的那句话

“由于with语句的变量对象是只读的,结果url就成了函数执行环境的一部分,因而可以作为函数的值被返回。”

反过来:如果with语句的变量对象是可写入的…… 刚才第3点提过,不能给对象写入原来不存在的属性,先这样理解,下面还有另外的含义。

那延长作用域链又是怎么回事?

一般的,“由于with语句块中作用域的‘变量对象’是只读的,所以在他本层定义的标识符,不能存储到本层,而是存储到它的上一层作用域”。这里又要理解有一层“只读”的含义。

在Javascript的作用域中(作用域,想想就是函数块,每个函数都会有个函数名,就算是匿名函数也有个空函数名),那么创建作用域的时候,本层的标识符就可以寄托在这个作用域下,而with语句块中作用域的‘变量对象’是只读的,不能存储标识符,只能存储在其上一层,这就是延长作用域链。其实,这和上面说的不能给对象添加属性有同工之处。

其实,完全可以这样理解,在Javascript中,没有块级作用域,就是说除了函数,其他的块级代码都没有自己的作用域。

现在说一下之前提到的with代码块中变量处理方式的问题

用事实说话:

Js代码  
var o={href:"sssss"};
var href="1111";
function buildUrl(){  var qs="?debug=true";       with(o){  href="2222";  var url=href+qs;  }      return url;
}
var result=buildUrl();
alert(result);
alert(href);  

结果:2222?debug=true  +  1111

很明显,with语句中并没有更改变量href的值,而是更改了 o 对象的 href 属性。

就是说,with中首先查找的是相关对象的属性,如果没有,才改变变量的值。你可以将以上例子o对象的href属性去掉看看。

转载于:https://www.cnblogs.com/baiyuhong/p/5380610.html

javascript:with的用法以及延长作用域链相关推荐

  1. JS -- 作用域、作用域链以及延长作用域链的方法

    作用域 作用域就是变量的有效范围. 在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域 1.全局作用域: 不在函数内部或者大括号里的就是是全局作用域,全局作用域下声明的变量可以在程序的任意 ...

  2. 如何延长作用域链_第4部分2:作用域(链)和 闭包

    知识列表作用域/作用域链 闭包(涉及JS垃圾回收机制 )https://zhuanlan.zhihu.com/p/27110726 [ js 基础 ][读书笔记]作用域和闭包https://jueji ...

  3. 如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...

    最近,听到李笑来说,讲解编程的过程中,举例子很重要. 而且,我最近看的各种javaScript工具书中的例子,也都有点复杂. 所以啊,我试着举一些简单又直观的例子,与各位苦学javaScript的同学 ...

  4. JavaScript之作用域链

    本文共 1200 字,读完只需 4 分钟 概述 JavaScript 中的可执行代码有其执行上下文,在执行上下文中,有三个重要的元素: 变量对象(variable object) 作用域链(scope ...

  5. JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

    闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...

  6. javaScript执行环境、作用域链与闭包

    一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...

  7. 图解Javascript——作用域、作用域链、闭包

    什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...

  8. 使用变量对象引出作用域链

    <script type="text/javascript"> var name="xm"; //全局变量,window.name===name;  ...

  9. 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例

    函数作为返回值练习 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

最新文章

  1. cpc卡内计费信息异常包括_抖音信息流落地页直达广告怎么做?
  2. multi-target not supporte
  3. signature=94f3cd0155e1d8c8ff09aa94177adccd,研擬顆粒流與連體數值耦合方法模擬山崩產生之震動訊號...
  4. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA
  5. 计算机怎么录制视频教程,怎么录制视频教程?查看电脑具体录屏方法
  6. c语言编写程序求8,使用c语言编写程式,实现计算1*2*3+4*5*6+7*8*9+……+28*29*30的值...
  7. Zookeeper Tutorial 2 -- Programmer's Guide
  8. IIS Tomcat共享80端口
  9. 地表反照率数据、地表净辐射通量、太阳辐射数据、地表温度、地表显热通量、NDVI、NPP、土地利用数据
  10. 松下PLC 三个单位的延时定时器指令的使用
  11. Hadoop之纠删码
  12. Windows命令--wmic
  13. ICPC World Finals 2015 D题 - Cutting Cheese 【二分答案】【球缺体积公式】
  14. 在市场买一个小鸡都要20多块,为什么加工好的童子鸡才19块?
  15. vc++之windows api
  16. 分享一个实用的自媒体一键多发平台,关键是能免费用
  17. base64 string类 放不下_千夜空的推荐 | LOFTER(乐乎) - 让兴趣,更有趣
  18. WEB——HTML、CSS、javascript
  19. 手机QQ视频图像是反的——解决办法
  20. 2019前端学习路线图

热门文章

  1. 布隆过滤器(Bloom Filter)的原理和实现
  2. HashMap和ArrayList初始大小和扩容后的大小
  3. Navicat远程连接linux下mysql服务器1045错误解决办法在这儿
  4. mysql中基本的DML语句
  5. 手机知识:手机蓝牙有6个使用场景,你都知道吗?
  6. 盘点全球最厉害的14位程序员,你认识几个?
  7. 数据库:MySQL大批量SQL插入性能优化
  8. 收集MySQL常用函数,值得收藏!
  9. NTP时间服务器介绍
  10. localdatetime 默认时间_datetime-local设置初始值