在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 相关文章推荐
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
js控制table合并具体实现
Feb 20 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
Oct 19 Javascript
原生javascript实现图片放大镜效果
Jan 18 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
Mar 07 Javascript
tsconfig.json配置详解
May 17 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
Sep 11 Javascript
微信小程序使用自定义组件导航实现当前页面高亮
Jan 02 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
原型方法的不同写法居然会影响调试的解决方法
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
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
PHP反射机制用法实例
2014/08/28 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
21个值得收藏的Javascript技巧
2014/02/04 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
js实现分页功能
2017/05/24 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
小程序tab页无法传递参数的方法
2018/08/03 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
Python实现统计代码行的方法分析
2017/07/12 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
如何用Django处理gzip数据流
2021/01/29 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
美国酒店控股公司:Choice Hotels
2018/06/15 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
给老师的道歉信
2014/01/11 职场文书
村官工作鉴定评语
2014/01/27 职场文书
小区门卫管理制度
2014/01/29 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
公证处委托书
2015/01/28 职场文书
法定代表人免职证明
2015/06/24 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
安全学习心得体会范文
2016/01/18 职场文书
Python之matplotlib绘制折线图
2022/04/13 Python