Javascript 为什么JSHint不喜欢对象上方法调用的ternaries?
JSHint给出以下错误: 应为赋值或函数调用,而应为表达式 对于以下代码行:Javascript 为什么JSHint不喜欢对象上方法调用的ternaries?,javascript,jshint,Javascript,Jshint,JSHint给出以下错误: 应为赋值或函数调用,而应为表达式 对于以下代码行: (aFunctionOrNull) ? aFunctionOrNull() : someObject.someMethod(); 它突出显示了someMethod上的最后一个),因此我假设错误就在那里。当我将JSHint改为if(){}else{}语法时,代码运行正常,JSHint没有问题。我不介意较长的语法,但我想了解为什么JSHint会这样说,以及这是否是一种糟糕的做法 最大的困惑可能来自术语。someObje
(aFunctionOrNull) ? aFunctionOrNull() : someObject.someMethod();
它突出显示了someMethod
上的最后一个)
,因此我假设错误就在那里。当我将JSHint改为if(){}else{}
语法时,代码运行正常,JSHint没有问题。我不介意较长的语法,但我想了解为什么JSHint会这样说,以及这是否是一种糟糕的做法
最大的困惑可能来自术语。
someObject.someMethod()
不是函数调用吗?JSHint谈到表达式,或者expr
:
此选项不显示有关在以下位置使用表达式的警告:
通常,您希望看到赋值或函数调用。最
在当时,这样的代码是一个打字错误。然而,这并不是政府所禁止的
这就是为什么这个警告是可选的
而JSLint说:
expression语句应为赋值语句或
函数/方法调用或删除。所有其他表达式语句都是
被认为是错误的
好了,做你正在做的事情没有问题,只是它会发出警告,因为它希望你使用一个if..else
语句,但是你可以在JSHint中关闭它,方法是:
/*jshint expr:true */
这是因为三元数是一个表达式。您可以使用它设置一个变量:
var result = a ? b : c;
请注意,三元计算结果为b
或c
。这是一个表达
也就是说,这个警告(我相信)来自这样一个概念:ternaries的可读性比if…else
块差。上面的代码可以重写
var result;
if (a) {
result = b;
} else {
result = c;
}
这比三元表更容易阅读。JSHint在提升可读代码方面所做的工作与提升有效代码一样多。如果您愿意在代码中包含这些表达式,请继续并禁用表达式警告。(这就是我要做的。)一般来说,使用三元运算符调用函数而不指定返回值(这似乎是您正在做的)被认为是不好的做法。
此外,值得检查一下JSHint对以下代码的看法:
(aFunctionOrNull || someObject.someMethod)();
如果affunctionornull
未定义(或null或falsy),逻辑or位将导致表达式计算为someObject.someMethod
,并调用该表达式的结果值(希望是对函数对象的引用)。这使您有机会编写更“故障安全”的代码,而无需大量嵌套三元代码:
(aFunctionOrNull || someObject.someMethod || function(){})();
分组表达式现在被绑定为计算一个真实值,因此不会抛出任何错误。为了避免JSHint唠叨您没有对返回值执行任何操作,可以将其分配给一个变量(我真的不喜欢这样做),或者在混合中添加一个小操作符:
~(aFunctionOrNull || someObject.someMethod || function(){})();//bitwise not
!(aFunctionOrNull || someObject.someMethod || function(){})();//logical not, doesn't really matter which one
关于最后一个问题:someObject.someMethod
实际上是一个函数调用。更具体地说,它是对someObject
上下文中的函数对象的调用对于那些不知道这一点的人:JS函数是对象,调用的上下文要么使用
bind
方法(在Function.prototype
上定义)显式设置,要么特别设置:
var referenceToMethod=someObject.someMethod;
参考方法()//谢谢你的回答!每种方法都为JS、JSHint和编码实践提供了有用的信息。JSHint适合于(affunctionornull | | someObject.someMethod)()代码>我认为,它比三元组读得更好,只是比if(){}else{}
略难读。我不得不用Chai's expect在Mocha测试中这样做,因为有时候我需要做expect(myVar).to.not.exist
哪个JSHint有问题,因为exist没有()
s.在阅读了您解释三元组的帖子后,我尝试了以下JSHint没有问题的方法:((affunctionornull)?affunctionornull:someObject.someMethod)()代码>然而,这看起来比if…else
块更清晰,JSHint也同意Elias的(affunctionornull | someObject.someMethod)建议()代码>为简洁起见。
var referenceToMethod = someObject.someMethod;
referenceToMethod();//<-- inside the function objects, this now points to the global object