为什么JSHint喜欢ternaries的方法在对象上调用?(Why does JSHint dis

2019-07-17 14:48发布

JSHint提供以下错误:

预计转让或函数调用,而是看到了一个表达。

对于下面的行的代码:

(aFunctionOrNull) ? aFunctionOrNull() : someObject.someMethod();

它强调了最终)someMethod所以我认为错误是存在的。 代码工作,当我将其更改为JSHint不会有问题if () {} else {}语法。 我不介意再语法,但我想了解为什么JSHint说这一点,如果这是一个不好的做法。

混乱的最大的一块可以来自术语。 是someObject.someMethod()不是一个函数调用?

Answer 1:

那么,在一般它被认为是不好的做法,称使用三元运算符(S)的函数,不分配的返回值(这是你仿佛在做)。
此外,它可能是值得检查什么JSHint不得不说的下面的代码:

(aFunctionOrNull || someObject.someMethod)();

如果aFunctionOrNull未定义(或空,或falsy), 逻辑或位将导致表达,以评估someObject.someMethod ,将所得的该值被调用(到功能对象的引用,希望)。 这给你写代码的机会,更多的“故障安全”没有散装的嵌套三元:

(aFunctionOrNull || someObject.someMethod || function(){})();

现在的分组表达式势必评估为truthy值,所以没有错误抛出那里。
为了避免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;
referenceToMethod();//<-- inside the function objects, this now points to the global object

一个简单的方法把它就是JS功能只是漂浮在漫无目的的内存/空间/时间,直到他们通过一个叫做引用,那么参考的情况下被传递给函数对象,以确定哪些对象,它会与。。。相互作用。 这是可悲的是,默认情况下,全局对象,或者null严格模式。



Answer 2:

JSHint说,有关表述,或者expr

此选项禁止对使用表达式而正常情况下,你会希望看到转让或函数调用的警告。 在大多数情况下,这样的代码是一个错字。 然而,它不是由规范禁止的,这就是为什么这个警告是可选的。

尽管JSLint的说:

表达式语句预计是分配或功能/方法调用或删除。 所有其他表达式语句都被认为是错误的。

据我所知,有在做你正在做什么,只知道它会发出警告,因为它会期望你使用没有问题if..else语句,但你可以在JSHint与关闭这个功能:

/*jshint expr:true */


Answer 3:

有错误是因为三元是一个表达式。 你可以用它来设置一个变量:

var result = a ? b : c;

请注意,该三元计算结果为bc 。 这是一个表达。

这就是说,警告(我相信)来自观念ternaries遭受比一个穷可读性if...else块。 上面的代码可被重写

var result;
if (a) {
    result = b;
} else {
    result = c;
}

这是很容易,三元阅读。 JSHint不一样,因为它确实有效的代码,以促进可读的代码。 如果你是舒服,包括在你的代码,这些表情,继续和禁用表达式的警告。 (这是我会做什么。)



文章来源: Why does JSHint dislike ternaries for method calls on objects?