立即调用函数表达式

时间:2015-04-15 10:10:23

标签: javascript function

这两个功能在世界上是如何不相同的?

var f2 = function () {
    console.log(f2); // undefined --> how and why ?
}();

&安培;

var f1 = function () {
    console.log(f1); // f1 function object
};
f1();

为什么第一个记录undefined? 我期待与第二个结果相同的结果然后我被undefined记录下来了。

1 个答案:

答案 0 :(得分:4)

在第一种情况下,f2的分配尚未发生。在赋值表达式中,将首先计算右侧表达式,并将结果分配给左侧表达式。直到那时变量才会有默认值undefined

在你的情况下应用它,只有执行函数对象的结果

function() {
   console.log(f2);
}

将被分配到f2。但是,您正在访问匿名函数对象中的f2。因此,返回默认值undefined,因为尚未将任何内容分配给f2

您可以像这样确认

var f2 = function () {
    return 1;
}();

console.log(f2);
// 1

此处,执行函数对象,并将结果分配给f2。直到作业完成,f2的值仅为undefined


注意:

在第一种情况下,即使在分配后,如果您执行console.log(f2),它也只会记录undefined。因为,您没有显式地从函数对象返回任何内容。因此,将返回默认值undefined,并将其存储在f2


在第二种情况下,函数对象被分配给f1,这就是您能够像函数(f1())一样调用它的原因。因此,当您在f1内记录f1时,它会打印函数对象。