在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轻量级模板引擎juicer使用指南
Jun 22 Javascript
javascript中HTMLDOM操作详解
Dec 11 Javascript
javascript中数组方法汇总
Jul 07 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
Dec 08 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
Feb 05 Javascript
Vue cli+mui 区域滚动的实例代码
Jan 25 Javascript
vue子路由跳转实现tab选项卡
Jul 24 Javascript
原生js实现随机点餐效果
Dec 10 Javascript
纯js+css实现在线时钟
Aug 18 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
Oct 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
关于尾递归的使用详解
2013/05/02 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
python提取字典key列表的方法
2015/07/11 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
Python实现网站注册验证码生成类
2017/06/08 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
2019/07/14 Python
Python 画出来六维图
2019/07/26 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
详解python播放音频的三种方法
2019/09/23 Python
Python3直接爬取图片URL并保存示例
2019/12/18 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
网络安全类面试题
2015/08/01 面试题
UNIX特点都有哪些
2016/04/05 面试题
2014年检验员工作总结
2014/11/19 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
《包身工》教学反思
2016/02/23 职场文书
pytorch实现线性回归以及多元回归
2021/04/11 Python
python中print格式化输出的问题
2021/04/16 Python
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android