以下操作失败,并显示ReferenceError: f1 is not defined
:
f1();
f1 = () => { console.log("f1"); }
但是以下方法可行:
exports.x = () => {
f1();
}
f1 = () => { console.log("f1"); }
第二种情况有什么解释?
答案 0 :(得分:2)
在第一种情况下,在定义函数之前先调用该函数,这就是发生错误的原因:
f1(); // <- function is called before the function expression is evaluated
f1 = () => { console.log("f1"); }
在第二种情况下,根本不调用该函数,相反,将来可能由模块使用者调用该函数。
exports.x = () => {
f1(); // <- it will be called only if a module consumer will execute the module as a function
}
f1 = () => { console.log("f1"); }
为了将模块作为函数调用,模块使用者将必须导入模块。导入模块时,将评估所有模块代码(包括我们的函数表达式)。因此,当模块使用者将模块作为函数调用时,函数表达式将被求值。
答案 1 :(得分:0)
您可以在函数内使用任何未声明的变量,这样不会引发错误。
在上面的第二个示例中,exports.x
没有被调用,因此没有错误。如果您致电,它将引发错误。
下面是一个例子
function test(){
console.log(x); //x is not defined still no error.
}
现在看看当我们调用该函数时会发生什么。
function test(){
console.log(x);
}
test();