在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 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
Apr 14 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
JavaScript获取table中某一列的值的方法
May 06 Javascript
JavaScript实现级联菜单的方法
Jun 29 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
jQuery easyui刷新当前tabs的方法
Sep 23 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
js实现百度搜索提示框
Feb 05 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
JS浮点数运算结果不精确的Bug解决
Aug 01 Javascript
VUE前后端学习tab写法实例
Aug 06 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
Jan 14 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函数
2006/10/09 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python解释器spython使用及原理解析
2019/08/24 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
在jupyter notebook中调用.ipynb文件方式
2020/04/14 Python
网站开发实习生的自我评价
2013/12/11 职场文书
就业协议书样本
2014/08/20 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
大学生学习计划书
2014/09/15 职场文书
2014年设计师工作总结
2014/11/25 职场文书
综合管理员岗位职责
2015/02/11 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
考研导师推荐信范文
2015/03/27 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书