javascript:with的用法以及延长作用域链
转自:http://lllt.iteye.com/blog/1246424
《Javascript高级程序设计(第二版)》第66页中提到:“由于with语句的变量对象是只读的,结果url就成了函数执行环境的一部分,因而可以作为函数的值被返回。”,不知道谁看完觉得一头雾水?
首先来看看他举的例子:
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代码块中变量处理方式的问题
用事实说话:
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的用法以及延长作用域链相关推荐
- JS -- 作用域、作用域链以及延长作用域链的方法
作用域 作用域就是变量的有效范围. 在一定的空间里可以对数据进行读写操作,这个空间就是数据的作用域 1.全局作用域: 不在函数内部或者大括号里的就是是全局作用域,全局作用域下声明的变量可以在程序的任意 ...
- 如何延长作用域链_第4部分2:作用域(链)和 闭包
知识列表作用域/作用域链 闭包(涉及JS垃圾回收机制 )https://zhuanlan.zhihu.com/p/27110726 [ js 基础 ][读书笔记]作用域和闭包https://jueji ...
- 如何延长作用域链_通过实例理解javaScript中的this到底是什么和它的词法作用域...
最近,听到李笑来说,讲解编程的过程中,举例子很重要. 而且,我最近看的各种javaScript工具书中的例子,也都有点复杂. 所以啊,我试着举一些简单又直观的例子,与各位苦学javaScript的同学 ...
- JavaScript之作用域链
本文共 1200 字,读完只需 4 分钟 概述 JavaScript 中的可执行代码有其执行上下文,在执行上下文中,有三个重要的元素: 变量对象(variable object) 作用域链(scope ...
- JavaScript执行环境 + 变量对象 + 作用域链 + 闭包
闭包真的是一个谈烂掉的内容.说到闭包,自然就涉及到执行环境.变量对象以及作用域链.汤姆大叔翻译的<深入理解JavaScript系列>很好,帮我解决了一直以来似懂非懂的很多问题,包括闭包.下 ...
- javaScript执行环境、作用域链与闭包
一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...
- 图解Javascript——作用域、作用域链、闭包
什么是作用域? 作用域是一种规则,在代码编译阶段就确定了,规定了变量与函数的可被访问的范围.全局变量拥有全局作用域,局部变量则拥有局部作用域. js是一种没有块级作用域的语言(包括if.for等语句的 ...
- 使用变量对象引出作用域链
<script type="text/javascript"> var name="xm"; //全局变量,window.name===name; ...
- 函数作为返回值练习 作用域和作用域链及预解析 闭包 闭包小案例
函数作为返回值练习 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...
最新文章
- cpc卡内计费信息异常包括_抖音信息流落地页直达广告怎么做?
- multi-target not supporte
- signature=94f3cd0155e1d8c8ff09aa94177adccd,研擬顆粒流與連體數值耦合方法模擬山崩產生之震動訊號...
- Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA
- 计算机怎么录制视频教程,怎么录制视频教程?查看电脑具体录屏方法
- c语言编写程序求8,使用c语言编写程式,实现计算1*2*3+4*5*6+7*8*9+……+28*29*30的值...
- Zookeeper Tutorial 2 -- Programmer's Guide
- IIS Tomcat共享80端口
- 地表反照率数据、地表净辐射通量、太阳辐射数据、地表温度、地表显热通量、NDVI、NPP、土地利用数据
- 松下PLC 三个单位的延时定时器指令的使用
- Hadoop之纠删码
- Windows命令--wmic
- ICPC World Finals 2015 D题 - Cutting Cheese 【二分答案】【球缺体积公式】
- 在市场买一个小鸡都要20多块,为什么加工好的童子鸡才19块?
- vc++之windows api
- 分享一个实用的自媒体一键多发平台,关键是能免费用
- base64 string类 放不下_千夜空的推荐 | LOFTER(乐乎) - 让兴趣,更有趣
- WEB——HTML、CSS、javascript
- 手机QQ视频图像是反的——解决办法
- 2019前端学习路线图