在JS中调用(0,func)()的目的是什么?

时间:2017-11-08 23:26:07

标签: javascript

我在code generated by Babelthis source中看到了这个问题。它似乎在某种程度上保护了一个必需的功能。

(0, _utilities.validateNextState)(nextDomainState, reducerName, action);

我理解括号中的逗号语句如何丢弃0并返回validateNextState函数,但为什么不这样做:

_utilities.validateNextState(nextDomainState, reducerName, action);

我的猜测是一种保护(如闭包保护范围,或者setTimeout使函数调用异步),但无法弄清楚它的用途是什么。

1 个答案:

答案 0 :(得分:3)

JavaScript的有时神秘的语义可能就是原因。表达式

const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

var LastUserId = function f() {return admin.database().ref('UserIds').limitToLast(1)}

exports.addWelcomeMessages = functions.https.onRequest((request, response)) => {
    var ref = admin.database().ref('UserIds');
    // this new, empty ref only exists locally
    var newChildRef = ref.push();
    // we can get its id using key()
    console.log('my new shiny id is '+newChildRef.key());
    // now it is appended at the end of data at the server
    newChildRef.set({User : LastUserId + 1});
});

当然评估对该函数的引用。但是,因为它位于带括号的子表达式中,所以外部的函数调用而不 (0, _utilities.validateNextState) 对象被识别为调用的上下文(_utilities值) 。因此,在this函数内,validateNextState将是this或对全局对象的引用,具体取决于“严格”模式状态。

我怀疑Babel这样做是因为在原始源代码中,对undefined的调用就像是一个“裸”函数,而不是一个对象上的方法。 Babel不知道(可能)validateNextState()的值是否对该特定函数有影响,但它必须确保它被安全地调用。