在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 相关文章推荐
List Information About the Binary Files Used by an Application
Jun 18 Javascript
Stop SQL Server
Jun 21 Javascript
使用jQuery的将桌面应用程序引入浏览器
Nov 19 Javascript
Javascript延迟执行实现方法(setTimeout)
Dec 30 Javascript
原生js实现给指定元素的后面追加内容
Apr 10 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
alert和confirm功能介绍
May 21 Javascript
深入理解javascript严格模式(Strict Mode)
Nov 28 Javascript
Angular CLI在Angular项目中如何使用scss详解
Apr 10 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
微信小程序自定义toast的实现代码
Nov 16 Javascript
javascript异常处理实现原理详解
Feb 17 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跳转页面的几种实现方法详解
2013/06/08 PHP
PHP编写的图片验证码类文件分享
2016/06/06 PHP
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
2016/06/23 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
javascript实现评分功能
2020/06/24 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
用python写asp详细讲解
2013/12/16 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
详解python中asyncio模块
2018/03/03 Python
tensorflow 使用flags定义命令行参数的方法
2018/04/23 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
python实现抖音点赞功能
2019/04/07 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
golang/python实现归并排序实例代码
2020/08/30 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
手术室护士自我鉴定
2013/10/14 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
出生医学证明书
2014/09/15 职场文书
行政司机岗位职责
2015/04/10 职场文书
师德承诺书2015
2015/04/28 职场文书