在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插件EasyUI EasyUI创建树形菜单
Nov 30 Javascript
js实现的彩色方块飞舞奇幻效果
Jan 27 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
May 05 Javascript
利用BootStrap弹出二级对话框的简单实现方法
Sep 21 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
Jun 12 Javascript
基于Bootstrap实现城市三级联动
Nov 23 Javascript
浅谈React组件之性能优化
Mar 02 Javascript
animate.css在vue项目中的使用教程
Aug 05 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
Aug 10 Javascript
layui表格分页 记录勾选的实例
Sep 02 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 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
thinkphp模板用法和内容输出实例
2014/11/28 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
javascript 冒号 使用说明
2009/06/06 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
推荐下python/ironpython:从入门到精通
2007/10/02 Python
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
用python处理MS Word的实例讲解
2018/05/08 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
Django继承自带user表并重写的例子
2019/11/18 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
美国鲍勃商店:Bob’s Stores
2018/07/22 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
汽车维修专业自荐书
2014/05/26 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
商务代表岗位职责
2015/02/15 职场文书
500字作文之周记
2019/12/13 职场文书