在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正则匹配换行问题实现代码
Dec 10 Javascript
jquery解析xml字符串简单示例
Apr 11 Javascript
jquery实现简单的自动播放幻灯片效果
Jun 13 Javascript
JavaScript用select实现日期控件
Jul 17 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
详解Node.js模块间共享数据库连接的方法
May 24 Javascript
JS实现鼠标移上去显示图片或微信二维码
Dec 14 Javascript
Vue结合原生js实现自定义组件自动生成示例
Jan 21 Javascript
bootstrap vue.js实现tab效果
Feb 07 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
基于模板引擎Jade的应用(详解)
Dec 12 Javascript
Layui数据表格之单元格编辑方式
Oct 26 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
关于js和php对url编码的处理方法
2014/03/04 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP fclose函数用法总结
2019/02/15 PHP
PHP实现的策略模式示例
2019/03/20 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
jQuery版仿Path菜单效果
2011/12/15 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
由浅入深剖析Angular表单验证
2016/07/14 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
python处理csv数据的方法
2015/03/11 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
床上用品全球在线购物:BeddingInn
2016/12/18 全球购物
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
工业设计专业个人求职信范文
2013/12/28 职场文书
学生出入校管理制度
2014/01/16 职场文书
如何写好优秀的创业计划书
2014/01/30 职场文书
党员自评材料范文
2014/12/17 职场文书
爱晚亭导游词
2015/02/09 职场文书
音乐课《小猫钓鱼》教学反思
2016/02/18 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript
Github 使用python对copilot做些简单使用测试
2022/04/14 Python