Javascript 立即调用函数表达式
这两种功能究竟是如何不同的呢Javascript 立即调用函数表达式,javascript,function,Javascript,Function,这两种功能究竟是如何不同的呢 var f2 = function () { console.log(f2); // undefined --> how and why ? }(); 和 var f1 = function () { console.log(f1); // f1 function object }; f1(); 为什么第一个日志未定义? 我期望得到与第二个相同的结果,然后我被从椅子上摔下来,记录了未定义的。在第一个案例中,分配到f2的任务尚未发生。在赋值表
var f2 = function () {
console.log(f2); // undefined --> how and why ?
}();
和
var f1 = function () {
console.log(f1); // f1 function object
};
f1();
为什么第一个日志未定义?
我期望得到与第二个相同的结果,然后我被从椅子上摔下来,记录了
未定义的。在第一个案例中,分配到f2
的任务尚未发生。在赋值表达式中,将首先计算右侧表达式,然后将结果赋值给左侧表达式。在此之前,变量将只有默认值未定义
将其应用到您的案例中,只需执行函数对象的结果
function() {
console.log(f2);
}
将被分配到f2
。但是,您正在访问匿名函数对象中的f2
。因此,返回默认值undefined
,因为没有为f2
赋值
你可以这样确认
var f2 = function () {
return 1;
}();
console.log(f2);
// 1
这里,执行函数对象,并将结果分配给f2
。在赋值发生之前,f2
的值将仅为未定义的
注意:
在第一种情况下,即使在分配之后,如果执行console.log(f2)
,它也将只记录未定义的。因为,您没有显式地从函数对象返回任何内容。因此,将返回默认值undefined
,并将其存储在f2
中
在第二种情况下,函数对象被分配给f1
,这就是为什么可以像函数一样调用它(f1()
)。因此,当您在f1
自身中记录f1
时,它将打印函数对象。在第一种情况下,尚未发生对f2
的赋值。在赋值表达式中,将首先计算右侧表达式,然后将结果赋值给左侧表达式。在此之前,变量将只有默认值未定义
将其应用到您的案例中,只需执行函数对象的结果
function() {
console.log(f2);
}
将被分配到f2
。但是,您正在访问匿名函数对象中的f2
。因此,返回默认值undefined
,因为没有为f2
赋值
你可以这样确认
var f2 = function () {
return 1;
}();
console.log(f2);
// 1
这里,执行函数对象,并将结果分配给f2
。在赋值发生之前,f2
的值将仅为未定义的
注意:
在第一种情况下,即使在分配之后,如果执行console.log(f2)
,它也将只记录未定义的。因为,您没有显式地从函数对象返回任何内容。因此,将返回默认值undefined
,并将其存储在f2
中
在第二种情况下,函数对象被分配给f1
,这就是为什么可以像函数一样调用它(f1()
)。因此,当您在f1
自身中记录f1
时,它会打印函数对象。在定义变量时,变量尚未定义。在第一种情况下,当您调用函数f2
时,它不是被分配的变量,在第二种情况下-变量具有值-我现在看到的匿名函数。我需要命名函数表达式。@BlagoErešYup,如果您不打算立即使用命名函数,并且需要多次使用它,那么最好使用命名函数。在定义变量时,变量尚未定义。在第一种情况下,当您调用函数f2
时,它不是被分配的变量,在第二个变量中,我现在看到了值匿名函数。我需要命名函数表达式。@BlagoErešYup,如果您不打算立即使用命名函数并且需要多次使用它们,则最好使用命名函数。您需要添加var f2代码>首先在上面case@Grundy我的意思是,在OP的表达式中,函数执行的结果将分配给f2
。我用文字解释:-)我只是想,你的意思是等效代码,而不是操作代码的一部分:-)你需要添加varf2代码>首先在上面case@Grundy我的意思是,在OP的表达式中,函数执行的结果将分配给f2
。我用文字解释:-)我只是想,你指的是等效代码,而不是操作代码的一部分:-)