在js中使用"with"语句中跨frame的变量引用问题


Posted in Javascript onMarch 08, 2007

在脚本编程时使用with语句,可以大大的缩减使用多级对象引用代码行的长度,这是JScript提供给我们的一个Syntax Sugar。当然不使用with,使用临时变量也可以达到同样的效果。不过创建变量时起名确实不是一件很遐意的事,就连MASM高版本中也提供了一个@@(以及@F和@B)来处理临时标号的问题,看来大家都是比较懒得啦。 

     我也挺喜欢用with语句的,确实可以省不少的事情,而且可以让代码变得也清晰些,特别是在处理跨frame的变量引用时,更加显得方便。这不今天就因为贪图方便又撞到枪口上了,在with中去取跨frame的变量时,遇到一个莫名其妙的bug郁闷了半天。 

     我写的代码其实不复杂,就是在一个with中,作了很多另一个frame中的变量引用和计算操作后,把结果赋值到本页面函数的一个局部变量里。事例代码大概如下:  // ... 
 var hierarchies = []; 
 with(parent.frames['xxxFrame']) 
 { 
     // 引用xxxFrame里的变量和值产生我要的东西 
     hierarchies.push(xxx); 
 } 

 // 开始使用hierarchies 
     这时hierarchies比较发疯,不管怎么弄里面的值老是和想要得值有却别,但又不是完全不对(后面会说为什么会这样,同时这是也严重迷惑我debug的一个地方,被害惨了)。 

     为什么会这样?最后查出来原来是xxxFrame里也有一个叫hierarchies的变量,而且也是数组,放的内容居然也和我放的差不多,所以我前面说了为什么会被迷惑了吧。而且还不止这点,由于之前还写了一个这种类似的with来跨页面取数据,而且工作的很好,所以潜意识就觉得,with里的那个hierarchies就是with外的那个hierarchies。我也不记得xxxFrame中那个变量是不是我自己定义的了,反正debug时被郁闷了好一阵子:(。 

     JScript手册说with(objects) statements的作用是:为语句设定默认对象。不过在with内部对变量的作用范围,它有个搜索规则,就是优先做默认对象(objects)中的匹配。虽然有时觉得默认对象的作用域更"远",就像跨frame这种情况。当默认对象引用中不能匹配,就匹配with之前被声明过的变量。都不能匹配到就是undefined了。 

     本文只能老实收入"debug中的滑铁卢"中了。

Javascript 相关文章推荐
Javascript 面试题随笔
Mar 31 Javascript
javascript中简单的进制转换代码实例
Oct 26 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
Nov 21 Javascript
JS生成不重复随机数组的函数代码
Jun 10 Javascript
js调试工具Console命令详解
Oct 21 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
May 30 Javascript
基于WebUploader的文件上传js插件
Aug 19 Javascript
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
Aug 25 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
JS+CSS实现3D切割轮播图
Mar 21 Javascript
JS类库Bindows1.3中的内存释放方式分析
Mar 08 #Javascript
使用IE的地址栏来辅助调试Web页脚本
Mar 08 #Javascript
JScript中的undefined和"undefined"的区别
Mar 08 #Javascript
JavaScript语句可以不以;结尾的烦恼
Mar 08 #Javascript
JScript中的"this"关键字使用方式补充材料
Mar 08 #Javascript
function, new function, new Function之间的区别
Mar 08 #Javascript
JavaScript中this关键字使用方法详解
Mar 08 #Javascript
You might like
基于PHP文件操作的详解
2013/06/05 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
基于javascript实现的搜索时自动提示功能
2014/12/26 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
js实现验证码功能
2020/07/24 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
Python常见文件操作的函数示例代码
2011/11/15 Python
python 七种邮件内容发送方法实例
2014/04/22 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
一百行python代码将图片转成字符画
2021/02/19 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
通信专业个人自我鉴定
2013/10/21 职场文书
网络工程专业毕业生推荐信
2013/10/28 职场文书
工作表扬信的范文
2014/01/10 职场文书
公司离职证明样本
2014/09/13 职场文书
导师对论文的学术评语
2015/01/04 职场文书
婚宴邀请函
2015/01/30 职场文书
亮剑观后感500字
2015/06/05 职场文书
PostgreSQL怎么创建分区表详解
2022/06/25 PostgreSQL