我在code generated by Babel的this source中看到了这个问题。它似乎在某种程度上保护了一个必需的功能。
(0, _utilities.validateNextState)(nextDomainState, reducerName, action);
我理解括号中的逗号语句如何丢弃0
并返回validateNextState
函数,但为什么不这样做:
_utilities.validateNextState(nextDomainState, reducerName, action);
我的猜测是一种保护(如闭包保护范围,或者setTimeout使函数调用异步),但无法弄清楚它的用途是什么。
答案 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()
的值是否对该特定函数有影响,但它必须确保它被安全地调用。