javascript:with的用法以及延长作用域链

转自: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux之pmap命令查看进程的地址空间和占用的内存

1 问题 我们怎么知道进程占用的内存多大 2 我们可以使用pmap命令 pmap命令用于显示一个或多个进程的内存状态,报告进程的地址空间和内存状态信息。 一般使用 pmap pid 一般参数选项如下 -x extended显示扩展格式 -d device显示设备格式 -q quiet不显示header/footer行 …

HealthKit有名无实,疑点重重

苹果在今年的全球开发者大会上发布了全新的iOS系统,其中的HealthKit以及Health app是显著的亮点之一。苹果希望通过HealthKit整合个人健康相关的数据,然而距离该系统的正式发布还有几个月的时间,这个数据平台到底要如何运作目前还有很多疑问。…

【OAuth2】:赋予用户控制权的安全通行证--原理篇

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于OAuth2的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.什么是OAuth? 二.为什么要用OAuth?…

坚持建设国家自主信息体系,龙芯中科胡伟武“419”论坛畅谈LoongArch生态建设蓝图...

4月19日,第五届关键信息基础设施自主安全创新论坛在北京召开,这也是龙芯中科正式发布自主指令系统LoongArch一周年之际。在本次论坛上,龙芯中科董事长胡伟武发表了《龙架构(LoongArch)生态建设》的演讲,围绕…

一键安装lamp脚本--初级版

#!/bin/bash#write by zhang_pc#at 2015.07.21#apache2.2.27 mysql5.1 php5.4#安装说明,由于网速原因,就不下载了,执行脚本前要把源码上传到脚本相同的目录下echo -e "\033[32m this is a lamp 一键安装script\033[0m"echo -e &quo…

(十)python3 只需3小时带你轻松入门——模块与包

模块 一般情况下,是一个以.py为后缀的文件。使用import导入。我们创建一个py文件,名为myprint,该py文件作为模块,在里面定义一个函数名为myprint: def myprint():print(这是我的print模块)保存后,在同目录…

【ArcGIS风暴】ArcGIS 10.6创建规则格网(渔网fishnet)图文经典详解

GIS中常常需要地图分幅与编号,或者需要按照规则格网(三角网、矩形网等)去批量裁剪或提取矢量和栅格数据,相关内容可以参看下面的文章。本文主要详细讲解ArcGIS10.6软件中创建渔网的方法,为地图分幅或规则裁剪做好数据准备。 ArcGIS批量裁剪提取或分幅方法总结参考文章: 《…

计算机转财经专业考试考什么,高三对口升学第三次模拟考试财经基础课计算机专业课...

商丘市三高2012-2013学年度第二学期第五次模考《计算机专业专业课》试卷一、选择题(每小题2分,共100分。)1、在Access中,建立的数据库文件的扩展名为()。(A)dbt (B)dbf (C)mdf (D)mdb2、如果“通讯录”表和“籍贯”表通过各自的“籍贯代码”字段建立了一…

linux之wget和curl如何携带cookie进行链接访问

1 问题 wget和curl如何携带cookie进行链接访问 2 解决办法 1) curl携带cookie curl --cookie "key=value" "链接地址" 这里的链接一定要加上双引号,如果链接太长,可能有问题. 如下 curl --cookie "name=zhangsan" "http://localhost…

xshell通过隧道连接_DNS安全之隧道攻击

DNS隧道攻击原理:即协议封装,IP over DNS,将其他协议封装在合法的dns请求和应答报文中,clent端通过构造特殊的域名记录请求发送数据给server,server端通过构造特殊的txt记录值来回应数据给client。其特点:请…

C#内建接口:IEquatable泛型

这节来讲一下泛型接口:IEquatable。IEquatable泛型接口处于System.Runtime命名空间下,最早在.NET Framework 2.0中发布,只有泛型版本。像之前我们讲过的IComparable,IEnumerable接口,它们属于是1.0时期的内建接口&…

JAVA 10(多线程)

创建线程:通过对java.lang包的查找,继承Thread类可以创建线程1,建立类继承Thread类2,复写Thread中的ran方法。3,调用线程的start()方法,该方法的作用是,启动线程,调用ran方法。publi…

地球空间与数字测绘知识总结

1、地理空间(geo-spatial) 一般指上至电离层,下至地壳与地幔交界的莫霍面之间的空间区域。上下大约有2000km。 2、自然球体 由地球自然表面所包围的形体称为地球自然形体。

(附)python3 只需3小时带你轻松入门——python常用一般性术语或词语的简单解释

术语一般解释dict 字典一种键值对的关系,一个键代表一个索引,一个键对应一个值index 索引在列表、数组、字典或一般容器中表示一个内容值的“地址”,通过索引可以获取值开发环境当前开发所需要的一些基本软件、硬件或操作系统list 列表一种数…

linux c之判断字符串是不是以另一字符串开始或者结尾

1 问题 判断字符串是不是以另一字符串开始或者结尾 2 代码实现 #include <stdio.h> #include <string.h>/***判断是字符串str是不是以start开始*/ int is_start_with(const char *str, char *start) {if (NULL == str || NULL == start){return -1;}int str_len …

联想台式计算机 不启动u盘,新电脑不识别u盘启动盘?不用送修,自己就能搞定!...

原标题&#xff1a;新电脑不识别u盘启动盘&#xff1f;不用送修&#xff0c;自己就能搞定&#xff01;新买的电脑想要通过u盘启动来装系统&#xff0c;但是一些用户却遇到难题了&#xff0c;以为制作好u盘启动盘就能直接开机启动了。殊不知&#xff0c;很多新电脑都是预装的win…

Hadoop(三)通过C#/python实现Hadoop MapReduce

MapReduceHadoop中将数据切分成块存在HDFS不同的DataNode中&#xff0c;如果想汇总&#xff0c;按照常规想法就是&#xff0c;移动数据到统计程序&#xff1a;先把数据读取到一个程序中&#xff0c;再进行汇总。但是HDFS存的数据量非常大时&#xff0c;对汇总程序所在的服务器将…

EntityFramework 动态构造排序 FuncIQueryableT, IOrderedQueryableT Dynamic

using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; /*** * jackchain * QQ:710782046* 2017-08-31* 动态构造OrderBy Linq序列* */namespace UFX.Tools {public class Convert…

hdu 5310 Souvenir

http://acm.hdu.edu.cn/showproblem.php?pid5310 题意&#xff1a;今天是BestCoder一周年纪念日. 比赛管理员Soda想要给每个参赛者准备一个纪念品. 商店里纪念品的单价是p 元, 同时也可以花q 元购买纪念品套装, 一个套装里有m 个纪念品. 今天总共有n 个参赛者, Soda想要知道最…

ArcGIS 10.2中栅格数据的属性表问题

什么条件下我们能在ArcGIS中看到栅格数据的属性表呢? 网上的说法是:对于单波段的整型ESRI GRID数据,如果它的像元值范围小于10万(max-min<1000000),并且少于500条唯一值,那么软件会为它创建一个“真正”的属性表存储在INFO文件夹的grid.VAT表格中。对于不满足上述条…