在JavaScript中遭遇级联表达式陷阱


Posted in Javascript onMarch 08, 2007

依稀还记得,在学习C语言的库函数时,很多字符串操作相关的函数都会返回和结果相关的指针。其实这个返回值很多时候都并不是非常必要,因为在我们的传入的参数中,十有八九已包含了这个指针。而加上这个返回值的最大好处就是,可以让我们方便的书写出级联表达式。但是这些年的实际工作中,越发觉得级联表达式是个魔鬼馅饼。

    比如在C语言中,我们熟悉的字符串操作函数strcpy,strcat等,它们的原形一般是: extern char *strxxx(char *dest, char *src);
    返回值char*其实就是调用参数中的*dest,这样一来就可以方便的写出级联表达式,如下:
char *title = "Mr. ";
char *name = "birdshome";
int len = strlen(strcat(title, name));
    在面向对象编程中,通过方法返回对象,我们可以编写链式表达式。虽然不管是级联表达式也好,还是链式表达式也好,都可以让我们在编写代码的方便一些,不过如果使用不当,也会非常郁闷。特别是对于级联表达式,如果函数嵌套过多,不易理解不说,debug也会很郁闷。

    下面这个JavaScript的级联语句,就让我郁闷了很久。。。 dimInfo.push(StringHelper.ArrayToString(item.m_DimensionName,
   item.m_DimensionUniqueName, item.m_AnalysisStatus,
   (item.m_IsParameterized ? 'checked' : ''), item.m_DimensionType), levelTypes);
    而正确的语句因该是下面这个: dimInfo.push(StringHelper.ArrayToString(item.m_DimensionName,
   item.m_DimensionUniqueName, item.m_AnalysisStatus,
   (item.m_IsParameterized ? 'checked' : ''), item.m_DimensionType, levelTypes));
    问题就出在倒数第二个括号上")"上,本来这个括号应该在参数levelTypes之后,结果没有注意弄到了levelTypes前面去了,这种书写上的错误,要一眼看出来很难很难。更郁闷的是,JavaScript对函数的参数个数,以及有没有参数都一点不感兴趣,所以这个错误的语句完全可以运行"正常",只是数据传到后台后,怎么也得不到需要的值,总是undefined。

    另外,还有复合参数调用的语句,如果能适当的展开也会给我们带来很多好处,比如代码:
var rect = dashboard.getBoundingClientRect();
this.InsertNewRoom(dashboard, event.clientX-rect.left-1, event.clientY-rect.top, event);
    将复合参数展开后的代码为: var rect = dashboard.getBoundingClientRect();
var innerX = event.clientX-rect.left-1;
var innerY = event.clientY-rect.top;
this.InsertNewRoom(dashboard, innerX, innerY, event);
    虽然这个展开的代码没有添加任何额外的逻辑,但是添加了临时变量innerX和innerY的语句显然比复合参数的语句要易于理解的多。这样代码虽然多了,但是却使代码有了self-documented特性,同时也没有改变代码的逻辑和效率。我相信在debug或者修改别人的代码时,你是希望看到后一种写法的。

Javascript 相关文章推荐
灵活应用js调试技巧解决样式问题的步骤分享
Mar 15 Javascript
ajax java 实现自动完成功能
Dec 19 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
js 对小数加法精度处理示例说明
Dec 27 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
Javascript的表单与验证-非空验证
Mar 18 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
关于vue面试题汇总
Mar 20 Javascript
解决vue路由后界面没有变化,但是链接有的问题
Sep 01 Javascript
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
JavaScript实现背景自动切换小案例
Sep 27 Javascript
vue中echarts图表大小适应窗口大小且不需要刷新案例
Jul 19 Javascript
原型方法的不同写法居然会影响调试的解决方法
Mar 08 #Javascript
在js中使用"with"语句中跨frame的变量引用问题
Mar 08 #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
You might like
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
php 删除一个数组中的某个值.兼容多维数组!
2012/02/18 PHP
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
vue.js使用v-if实现显示与隐藏功能示例
2018/07/06 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
Python3解释器知识点总结
2019/02/19 Python
Python从文件中读取指定的行以及在文件指定位置写入
2019/09/06 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
电子商务专业学生的自我鉴定
2013/11/28 职场文书
高中军训感想800字
2014/02/23 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
篝火晚会策划方案
2014/05/16 职场文书
销售求职信范文
2014/05/26 职场文书
公证书格式
2015/01/23 职场文书
职工宿舍管理制度
2015/08/05 职场文书