在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 相关文章推荐
jQuery ui 1.7更新小结
Aug 15 Javascript
toString()一个会自动调用的方法
Feb 08 Javascript
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
May 24 Javascript
javascript 运算数的求值顺序
Aug 23 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
Bootstrap实现带动画过渡的弹出框
Aug 09 Javascript
利用JS测试目标网站的打开响应速度
Dec 01 Javascript
jquery登录的异步验证操作示例
May 09 jQuery
countUp.js实现数字滚动效果
Oct 18 Javascript
原生JS实现多条件筛选
Aug 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
PHP动态输出JavaScript代码实例
2015/02/12 PHP
Thinkphp微信公众号支付接口
2016/08/04 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Apache如何部署django项目
2017/05/21 Python
python实现自动登录后台管理系统
2018/10/18 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
Python3运算符常见用法分析
2020/02/14 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
如何用python开发Zeroc Ice应用
2021/01/29 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
应届医学毕业生求职信分享
2013/12/02 职场文书
融资租赁计划书
2014/04/29 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
员工辞职信范文
2015/03/02 职场文书
公务员保密工作承诺书
2015/05/04 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers