在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使用技巧简单汇总
Apr 18 Javascript
JS中捕获console.log()输出的方法
Apr 16 Javascript
jQuery中ajax的load()与post()方法实例详解
Jan 05 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
浅谈Vue的基本应用
Dec 27 Javascript
jquery.masonry瀑布流效果
May 25 jQuery
解读ES6中class关键字
Nov 20 Javascript
浅谈React + Webpack 构建打包优化
Jan 23 Javascript
vue3实现v-model原理详解
Oct 09 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 Javascript
TypeScript 运行时类型检查补充工具
Sep 28 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
phalcon model在插入或更新时会自动验证非空字段的解决办法
2016/12/29 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
python实现socket客户端和服务端简单示例
2014/02/24 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
小区门卫工作职责
2013/12/14 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
幼儿园毕业教师感言
2014/02/21 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
会议欢迎词
2015/01/23 职场文书
离开雷锋的日子观后感
2015/06/09 职场文书
神秘岛读书笔记
2015/07/01 职场文书
污染环境建议书
2015/09/14 职场文书
Vue实现动态查询规则生成组件
2021/05/27 Vue.js
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers