javascript:with的用法以及延长作用域链
来源:互联网 发布:淘宝查号131458come 编辑:程序博客网 时间:2024/05/22 07:57
看的js高级教程第三版没说那么详细,转下别人的看看
原文链接:http://www.cnblogs.com/zz334396884/p/4951042.html
《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属性去掉看看。
- javascript:with的用法以及延长作用域链
- javascript:with的用法以及延长作用域链
- with延长作用域链
- javascript延长作用域链
- javascript 延长作用域链 与没有块级作用域
- js 延长作用域
- x-requested-with的作用以及用法详解
- javascript with 的用法
- Javascript 作用域与this的用法
- javascript中的【变量作用域】和【作用域链】以及【闭包】的理解
- JavaScript中with的用法
- javascript中with的用法
- javascript 中 with 的用法
- javascript中with的用法
- javascript中with()方法的作用
- 关于Javascript 作用域 (with )
- JavaScript中setTimeout的作用域以及this指向问题
- JavaScript的作用域链
- BZOJ 1706: [usaco2007 Nov]relays 奶牛接力跑 floyd矩阵乘法
- 线程的五大状态
- DNS 禁用权威域名服务器递归解析
- Kaggle入门:Digit Recognizer
- maven+Spring+SpringMVC+mybatis+mybatis-generator 搭建SSM开发环境
- javascript:with的用法以及延长作用域链
- Kettle Spoon入门教程
- easyUI中datagrid中的formatter里面向后台发送请求获取数据
- 正则表达式找程序实用例子:正则表达式匹配不报含指定字符串,匹配后面跟着指定字符串
- 单目相机的标定
- ECLIPSE中构建ALIGN内核宏
- HDU
- http协议详解(转载)
- CheckStyle 简记