在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 05 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
jQuery中next方法用法实例
Apr 24 Javascript
js实现上传图片预览方法
Oct 25 Javascript
js导出excel文件的简洁方法(推荐)
Nov 02 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
Jan 04 Javascript
JavaScript实现两个select下拉框选项左移右移
Mar 09 Javascript
js原生Ajax的封装和原理详解
Mar 11 Javascript
JavaScript运动框架 多物体任意值运动(三)
May 17 Javascript
mui框架 页面无法滚动的解决方法(推荐)
Jan 25 Javascript
vue 中动态绑定class 和 style的方法代码详解
Jun 01 Javascript
五句话帮你轻松搞定js原型链
Dec 09 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 session 错误
2009/05/21 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
第五章 php数组操作
2011/12/30 PHP
Zend的MVC机制使用分析(二)
2013/05/02 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
用JS实现的一个include函数
2007/07/21 Javascript
js数组操作常用方法
2014/05/08 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
Python写入CSV文件的方法
2015/07/08 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
python ftplib模块使用代码实例
2019/12/31 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
入党申请书自我鉴定
2013/10/12 职场文书
项目开发计划书
2014/01/09 职场文书
演讲开场白和结束语
2015/05/29 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫