在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 相关文章推荐
基于jquery的一个图片hover的插件
Apr 24 Javascript
Jqyery中同等与js中windows.onload的应用
May 10 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
关于jQuery中.attr()和.prop()的问题探讨
Sep 06 Javascript
jquery实现多行文字图片滚动效果示例代码
Oct 10 Javascript
Vue.js学习之计算属性
Jan 22 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
基于 Vue 实现一个酷炫的 menu插件
Nov 14 Javascript
JS中offset和匀速动画详解
Feb 06 Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 Javascript
node.js基于socket.io快速实现一个实时通讯应用
Apr 23 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
Feb 06 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安装全攻略:APACHE
2006/10/09 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
zend framework重定向方法小结
2016/05/28 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
详解vue模拟加载更多功能(数据追加)
2017/06/23 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
JavaScript常用内置对象用法分析
2019/07/09 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
使用Python监控文件内容变化代码实例
2018/06/04 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
django实现模型字段动态choice的操作
2020/04/01 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
sort命令的作用和用法
2013/08/25 面试题
英文自荐信格式
2013/11/28 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
Python os和os.path模块详情
2022/04/02 Python
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers