好吧,一般来说,使用三元运算符调用函数而不分配返回值(这就是您似乎正在做的事情)被认为是不好的做法。
另外,可能值得检查 JSHint 对于以下代码的说明:
(aFunctionOrNull || someObject.someMethod)();
If aFunctionOrNull
未定义(或 null 或 false),则逻辑或位将导致表达式计算为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
确实是一个函数调用。更具体地说,这是对函数对象 in the someObject
的上下文。
对于那些不知道这一点的人:JS 函数是对象,调用的上下文可以使用显式设置bind
方法(定义在Function.prototype
) or ad-hoc:
var referenceToMethod = someObject.someMethod;
referenceToMethod();//<-- inside the function objects, this now points to the global object
一种简单的思考方法是,JS 函数只是在内存/空间/时间中漫无目的地漂浮,直到通过引用调用它们,然后将该引用的上下文传递给函数对象,以确定它将调用哪个对象与。。。相互作用。遗憾的是,这是默认的全局对象,或者null
在严格模式下。