在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 相关文章推荐
判断一个变量是数组Array类型的方法
Sep 16 Javascript
Extjs实现进度条的两种便捷方式
Sep 26 Javascript
JS实现在页面随时自定义背景颜色的方法
Feb 27 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
Sep 18 Javascript
TypeScript Type Innference(类型判断)
Mar 10 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
Feb 15 Javascript
在vue项目中引入高德地图及其UI组件的方法
Sep 04 Javascript
JS定义函数的几种常用方法小结
May 23 Javascript
node.js express捕获全局异常的三种方法实例分析
Dec 27 Javascript
OpenLayers3实现图层控件功能
Sep 25 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
Session的工作机制详解和安全性问题(PHP实例讲解)
2014/04/10 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
php动态变量定义及使用
2015/06/10 PHP
PHP array_shift()用法实例分析
2019/01/07 PHP
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
vue使用Proxy实现双向绑定的方法示例
2019/03/20 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
Python获取apk文件URL地址实例
2013/11/01 Python
Python常用的日期时间处理方法示例
2015/02/08 Python
Python实现将xml导入至excel
2015/11/20 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
Python使用wxPython实现计算器
2018/01/30 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
对pyqt5之menu和action的使用详解
2019/06/20 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
python中append函数用法讲解
2020/12/11 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
总经理职责
2013/12/22 职场文书
销售经理岗位职责
2014/03/16 职场文书
计生专干事迹
2014/05/28 职场文书
销售目标责任书
2014/07/23 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB