JavaScript 编码技术还是糟糕的代码?
Posted
技术标签:
【中文标题】JavaScript 编码技术还是糟糕的代码?【英文标题】:JavaScript coding technique or bad code? 【发布时间】:2011-05-04 17:49:14 【问题描述】:在调试别人编写的 javascript 时,我遇到了一些我以前从未见过的代码。这是一个示例:
function doSomething()
//doing something here...
function doItNow()
//other logic...
doSomething && doSomething(); // <=== What's this?
函数 doItNow() 中第二行的目的是检查 doSomething 是否存在然后调用它吗?像这样:
function doItNow()
//other logic...
if (doSomething)
doSomething();
JSLint 不喜欢它,我宁愿在我的应用程序中不要有错误的代码。有什么见解吗?
【问题讨论】:
我认为它非常聪明,尽管它确实损害了代码的可读性。我不会将这种“糟糕的代码”称为“可读性差的代码” 根据语言的不同,这可以被认为是一个标准的成语。 【参考方案1】:这确实是一个“速记”。只有当左侧作为if()
语句传递时,才会执行右侧。
Google Closure Compiler 和其他压缩器利用了这一点;如果您的输入是if(a) a()
,它将导致a&&a()
你可以对||
做同样的事情,例如:
if( !a )
alert('Not a');
可以写成
a || alert('Not a');
【讨论】:
【参考方案2】:是的,您的两个示例是“等价的”,&&
运算符执行short-circuit evaluation。
如果第一个操作数表达式产生 falsey 值(例如null
、undefined
、0
、NaN
、一个空字符串,当然还有false
),第二个操作数表达式将不计算,如果值为truthy,将进行函数调用。
但是如果doSomething
没有被声明,你的两个例子都会失败。
如果在代码中引用了未声明的标识符,您将收到ReferenceError
异常,例如:
function foo()
undeclared && undeclared();
try
foo();
catch (e)
alert(e); // ReferenceError!
如果你想:
-
确保标识符存在,并且
确保它是可调用的
你可以:
if (typeof doSomething == 'function')
doSomething();
typeof
operator 可以安全地用于不存在的标识符,此外,通过检查 doSomething
是一个函数,您可以确保可以调用它。
【讨论】:
@Tim,考虑到我的问题,接受的答案是最直接的答案。此外,大多数 JS 代码在生产中被缩小,大多数缩小器将“if”条件更改为简写。所以恕我直言,最好至少彻底理解速记,因为这是你经常看到的。 @Silkster:关于doSomething
未被声明的部分是至关重要的信息。如果doSomething
没有声明(比如你删除了函数声明),你会得到一个错误。【参考方案3】:
在比较中调用函数(或赋值等)通常是个坏主意。人们通常不期望比较会产生副作用。这种情况很简单,它可能是合理的,但如果有人不理解约定,他们可能不得不在 *** 上询问;)
【讨论】:
以上是关于JavaScript 编码技术还是糟糕的代码?的主要内容,如果未能解决你的问题,请参考以下文章
记录 curl 提交数据编码 及 javascript 转换 unicode 问题