在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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
让元素在网页中可拖动示例代码
Aug 13 Javascript
jquery浏览器滚动加载技术实现方案
Jun 03 Javascript
用js通过url传参把数据从一个页面传到另一个页面
Sep 01 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
Jul 22 Javascript
浅谈js算法和流程控制
Dec 29 Javascript
Bootstrap Table使用整理(三)
Jun 09 Javascript
JavaScript的setter与getter方法
Nov 29 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
微信小程序开发问题之wx.previewImage
Dec 25 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
Aug 03 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
Apache设置虚拟WEB
2006/10/09 PHP
在数据量大(超过10万)的情况下
2007/01/15 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
2010/06/28 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[01:19:46]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第一场 2月28日
2021/03/11 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
python操作 hbase 数据的方法
2016/12/18 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
python读取和保存图片5种方法对比
2018/09/12 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Python基于Faker假数据构造库
2020/11/30 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
婚礼主持词开场白
2014/03/13 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
委托证明书
2014/09/17 职场文书
于丹讲座视频观后感
2015/06/15 职场文书