依稀还记得,在学习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或者修改别人的代码时,你是希望看到后一种写法的。

转载于:https://www.cnblogs.com/birdshome/archive/2006/05/22/Syntax-Attention.html

在JavaScript中遭遇级联表达式陷阱相关推荐

  1. JavaScript中的函数表达式

    在JavaScript中,函数是个非常重要的对象,函数通常有三种表现形式:函数声明,函数表达式和函数构造器创建的函数. 本文中主要看看函数表达式及其相关的知识点. 函数表达式 首先,看看函数表达式的表 ...

  2. 在javascript中使用el表达式(jsp中的javascript中支持写el表达式,毋庸置疑,单独的js文件中不支持写el表达式,别钻牛角尖)

    哎,够背的,最后4张图怎么调整都很小,看不清楚,所以大家还是看我这篇文章吧在javascript中使用el表达式(图片清晰版,有图有真相),这篇文章的图片可以正常看清楚,跟我这篇文章是一样的内容! 有 ...

  3. 一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

    作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2 ...

  4. JavaScript中for..in循环陷阱介绍

    for...in循环中的循环计数器是字符串,而不是数字它包含当前属性的名称或当前数组元素的索引,下面有个不错的示例大家可以参考下 大家都知道在JavaScript中提供了两种方式迭代对象:  (1)f ...

  5. Javascript中的陷阱大集合【译】

    参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...

  6. html中this的作用,JavaScript 中的 this :工作原理和陷阱

    在 JavaScript 中,this 是一个相对难懂的特殊变量.因为它随处可用,而不仅仅是面向对象的编程中.本文将解释 this 是如何工作的,以及它可能导致问题的地方,并在文章的给出最佳实践. 为 ...

  7. [js点滴(转)]JavaScript中的this陷阱的最全收集--没有之一

    当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解释 ...

  8. html计算数学表达式,如何使用MathCalc在JavaScript中实现基本的数学表达式计算器...

    本文概述 在数学学校的好日子里, 老师不允许在教室里使用计算器.小时候, 我(可能仍然)很懒惰, 因此拥有可以解决任何数学运算的电子设备(卡西欧计算器的廉价广告)的可能性简直太棒了.现在, 尽管我每天 ...

  9. 在JavaScript中逐个遍历数组?

    如何使用JavaScript遍历数组中的所有条目? 我以为是这样的: forEach(instance in theArray) 其中theArray是我的数组,但这似乎是不正确的. #1楼 如果您不 ...

最新文章

  1. Microbiome:中外合作揭示微生物群落降解复杂微生物聚合物的酶(视频导读)
  2. json-lib把XML转化为json
  3. 华为自带时钟天气下载_华为EMUI10的最大亮点是什么?
  4. HDU1226 搜索 bfs xingxing在努力
  5. 代码收藏——js+asp 的屏幕滚动脚本
  6. phpMyAdmin批量修改Mysql数据表前缀的方法
  7. wk一sm5时间温度控制器_Android RTC 自下而上分析
  8. 警惕!不要让页面响应时间成为应用性能指标上的杠精
  9. php怎么取json数组元素个数,json,数组_取出json数据中的某一项组成一个数组?,json,数组,php - phpStudy...
  10. BMC AR 配置AREA LDAP
  11. Matlab运行程序_暂停方法
  12. python连接sap接口_python 连接SAP的方法
  13. matlab pn码捕获,直扩系统PN码捕获和跟踪的FPGA实现
  14. 在Magento 2中自定义电子邮件模板
  15. 删除ubuntu双系统后,开机出现grub黑屏,删除双系统引导项解决
  16. ae合成设置快捷键_AE脚本使用快捷键控制关键帧操作 Keyboard v1.2.1 + 使用教程【资源分享1081】...
  17. H3C_利用设置缺省静态路由优先级实现出口双线路的主备功能
  18. html 手机底部广告,手机网站被UC浏览器强制嵌入推荐广告解决方案
  19. 听说你要删库跑路了?这篇Linux脚本请收好
  20. 名帖222 赵孟頫 行书《行书三段卷》

热门文章

  1. 今天,“场景赋能•驱动有数”,神策数据 2018 数据驱动大会在京成功举办
  2. 万达电影携手神策数据 数据赋能打造全球领先电影生活生态圈
  3. 5家顶级投资方同台现身,力捧神策数据为哪般?
  4. 使用MemberShip,Profile时碰上的一些问题
  5. 【小技巧】Xcode7.1中KSImageNamed无效的解决方法
  6. hdu5126stars
  7. 移动开发工程师面试题集:Android iOS
  8. Android项目导出jar包的小技巧
  9. WEBMIN管理Centos5.2 or RedHat5.2以上版本时samba用户不能同步系统帐户
  10. xcode 4.2 如何调试 EXC_BAD_ACCESS