在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 相关文章推荐
一个可以兼容IE FF的加为首页与加入收藏实现代码
Nov 02 Javascript
javascript实现window.print()去除页眉页脚
Dec 30 Javascript
js实现根据身份证号自动生成出生日期
Dec 15 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
Jquery实现跨域异步上传文件总结
Feb 03 Javascript
javascript获取以及设置光标位置
Feb 16 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
May 12 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
Js视频播放器插件Video.js使用方法详解
Feb 04 Javascript
js实现坦克大战游戏
Feb 24 Javascript
jQuery实现鼠标拖动图片功能
Mar 04 jQuery
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读取MySQL数据代码
2008/06/05 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
Python+Django在windows下的开发环境配置图解
2009/11/11 Python
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
python中的五种异常处理机制介绍
2014/09/02 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
实例解析Python中的__new__特殊方法
2016/06/02 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python无序链表删除重复项的方法
2020/01/17 Python
Python requests模块cookie实例解析
2020/04/14 Python
Python类及获取对象属性方法解析
2020/06/15 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
python基于openpyxl生成excel文件
2020/12/23 Python
css3实现的下拉菜单效果示例
2014/01/22 HTML / CSS
您的网上新华书店:文轩网
2016/08/24 全球购物
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
经贸日语专业个人求职信范文
2014/04/29 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
实习介绍信模板
2015/01/30 职场文书
《所见》教学反思
2016/02/23 职场文书
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL