如果在内部导出,则在定义函数之前调用它是可以的

时间:2019-07-06 14:34:14

标签: javascript

以下操作失败,并显示ReferenceError: f1 is not defined

f1();
f1 = () => { console.log("f1"); }

但是以下方法可行:

exports.x = () => {
  f1();
}

f1 = () => { console.log("f1"); }

第二种情况有什么解释?

2 个答案:

答案 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();