在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 相关文章推荐
零基础学JavaScript最新动画教程+iso光盘下载
Jan 22 Javascript
疯狂Jquery第一天(Jquery学习笔记)
May 11 Javascript
extjs ColumnChart设置不同的颜色实现代码
May 17 Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 Javascript
一个可以增加和删除行的table并可编辑表格中内容
Jun 16 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
js判断手机端(Android手机还是iPhone手机)
Jul 22 Javascript
基于js文件加载优化(详解)
Jan 03 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
Jul 20 Javascript
通过jQuery学习js类型判断的技巧
May 27 jQuery
如何利用node.js开发一个生成逐帧动画的小工具
Dec 01 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中文分词的简单实现代码分享
2011/07/17 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
Js之软键盘实现(js源码)
2007/01/30 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
javascript时间差插件分享
2016/07/18 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
Vue中android4.4不兼容问题的解决方法
2018/09/04 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
如何基于JS截获动态代码
2019/12/25 Javascript
Vue 实现简易多行滚动"弹幕"效果
2020/01/02 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
儿童学习python的一些小技巧
2018/05/27 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
python打印异常信息的两种实现方式
2019/12/24 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
美国智能家居专家:tink
2019/06/04 全球购物
学术会议欢迎词
2014/01/09 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫