在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获取地址栏参数
Dec 22 Javascript
jQuery 性能优化指南 (1)
May 21 Javascript
javascript获得服务器端控件的ID的实现代码
Dec 28 Javascript
javascript实现限制上传文件大小
Feb 06 Javascript
ExtJs动态生成treepanel的Json格式
Jul 19 Javascript
JavaScript转换与解析JSON方法实例详解
Nov 24 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
Nov 21 Javascript
JavaScript模拟实现封装的三种方式及写法区别
Oct 27 Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 Javascript
基于Vue渲染与插件的加载顺序的问题详解
Mar 05 Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 Javascript
vue实现输入框自动跳转功能
May 20 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中命名空间的使用例子
2019/03/22 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
PHP Swoole异步读取、写入文件操作示例
2019/10/24 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
JS分割字符串并放入数组的函数
2011/07/04 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
python编写俄罗斯方块
2020/03/13 Python
python 实现Harris角点检测算法
2020/12/11 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
土建资料员岗位职责
2014/01/04 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
幼儿园2014年度工作总结
2014/11/10 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
企业团队精神心得体会
2016/01/19 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python