7

JSHint 给出以下错误:

期望一个赋值或函数调用,而是看到一个表达式。

对于以下代码行:

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

它突出显示了决赛)someMethod所以我认为错误就在那里。if () {} else {}代码有效,当我将其更改为语法时,JSHint 没有问题。我不介意更长的语法,但我想了解为什么 JSHint 会这样说,以及这是否是一种不好的做法。

最大的困惑可能来自术语。是someObject.someMethod()不是函数调用?

4

3 回答 3

5

JSHint 说的是表达式,或者expr

此选项抑制有关使用表达式的警告,通常您希望看到赋值或函数调用。大多数时候,这样的代码是一个错字。但是,规范并没有禁止它,这就是为什么这个警告是可选的。

虽然 JSLint 说:

表达式语句应为赋值或函数/方法调用或删除。所有其他表达式语句都被视为错误。

AFAIK,做你正在做的事情没有问题,只是它会发出警告,因为它希望你使用一个if..else语句,但你可以在 JSHint 中关闭它:

/*jshint expr:true */
于 2012-12-26T20:37:13.703 回答
5

好吧,一般来说,使用三元运算符调用函数而不分配返回值(这似乎是你正在做的)被认为是不好的做法。
此外,值得检查一下 JSHint 对以下代码的看法:

(aFunctionOrNull || someObject.someMethod)();

如果aFunctionOrNull未定义(或 null 或 falsy),则逻辑或位将导致表达式计算为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确实是一个函数调用。更具体地说,它是对' 上下文中的函数对象的调用。 对于那些不知道这一点的人:JS 函数是对象,被调用的上下文要么使用方法显式设置(在 上定义)或ad-hocsomeObject
bindFunction.prototype

var referenceToMethod = someObject.someMethod;
referenceToMethod();//<-- inside the function objects, this now points to the global object

一个简单的想法是 JS 函数只是在内存/空间/时间中漫无目的地漂浮,直到它们通过引用被调用,然后将该引用的上下文传递给函数对象,以确定它将是什么对象与。。。相互作用。遗憾的是,这是默认情况下或null严格模式下的全局对象。

于 2012-12-26T20:47:07.333 回答
3

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

var result = a ? b : c;

请注意,三元的计算结果为bor c。这是一种表达。

也就是说,警告(我相信)来自三元组的可读性比if...else块差的概念。上面的代码可以改写

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

这比三元更容易阅读。JSHint 在促进代码可读性方面所做的工作与它对有效代码所做的工作一样多。如果您愿意在代码中包含这些表达式,请继续禁用表达式警告。(这就是我会做的。)

于 2012-12-26T20:45:14.937 回答