好吧,一般来说,使用三元运算符调用函数而不分配返回值(这似乎是你正在做的)被认为是不好的做法。
此外,值得检查一下 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-hoc:someObject
bind
Function.prototype
var referenceToMethod = someObject.someMethod;
referenceToMethod();//<-- inside the function objects, this now points to the global object
一个简单的想法是 JS 函数只是在内存/空间/时间中漫无目的地漂浮,直到它们通过引用被调用,然后将该引用的上下文传递给函数对象,以确定它将是什么对象与。。。相互作用。遗憾的是,这是默认情况下或null
严格模式下的全局对象。