微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

原文地址:https://www.jb51.cc/js/152952.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐