javascript – 为什么JSHint不喜欢对象的方法调用三元组?

JSHint给出以下错误

Expected an assignment or function call and instead saw an expression.

对于以下代码行:

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

它突出了someMethod上的最后一个)所以我假设错误就在那里.代码工作,当我将其更改为if(){} else {}语法时,JSHint没有问题.我不介意更长的语法,但我想了解为什么JSHint会说这个,如果这是一个不好的做法.

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

解决方法

好吧,一般来说,使用三元运算符调用函数被认为是不好的做法,而没有分配返回值(这就是你似乎正在做的事情).而且,值得检查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确实是一个函数调用.更具体地说,它是在someObject的上下文中调用函数对象.
对于那些不知道这一点的人:JS函数是对象,并且使用bind方法(在Function.prototype上定义)或ad-hoc显式设置被调用的上下文:

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...