在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 相关文章推荐
文本框中,回车键触发事件的js代码[多浏览器兼容]
Jun 07 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
May 23 Javascript
JavaScript词法作用域与调用对象深入理解
Nov 29 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
Aug 06 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
Mar 12 Javascript
JS清除选择内容的方法
Jan 29 Javascript
javascript实现tab响应式切换特效
Jan 29 Javascript
javascript垃圾收集机制的原理分析
Dec 08 Javascript
vue: WebStorm设置快速编译运行的方法
Oct 18 Javascript
highCharts提示框中显示当前时间的方法
Jan 18 Javascript
初学node.js中实现删除用户路由
May 27 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 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学习之数组的定义和填充
2011/04/17 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
JavaScript 继承使用分析
2011/05/12 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
python中文编码问题小结
2014/09/28 Python
Python每天必学之bytes字节
2016/01/28 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
python单例模式实例解析
2018/08/28 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
ALDO加拿大官网:加拿大女鞋品牌
2018/12/22 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
大学生专业个人学习的自我评价
2013/10/26 职场文书
求职信格式范本
2013/11/15 职场文书
《猴子种树》教学反思
2014/02/14 职场文书
生产助理岗位职责
2014/06/18 职场文书
银行委托书范本
2014/09/28 职场文书
担保书范本
2015/01/20 职场文书
单位车辆管理制度
2015/08/05 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
MySQL创建表操作命令分享
2022/03/25 MySQL