为什么此代码会打印undefined
而不是function
:
if (function f(){}) {
console.log(typeof f);
}
...虽然这个按预期打印function
:
eval('function g(){}');
console.log(typeof g);
(并if (x = 42) console.log(x);
按预期打印42
。)
注意:我完全清楚这种代码是不好的做法,我知道大多数短信也会拒绝它,因为它们应该...但我只是<好奇 Javascript的翻译行为背后的逻辑是什么。
答案 0 :(得分:2)
因为命名函数表达式中函数的名称未添加到表达式所在的作用域(与函数声明不同,其中名称 添加到它发生的范围)。使用NFE时,名称仅在函数范围内。 if
中的那个是非正式会员。 eval
中的那个是声明。
示例:
// NFE
var x = function foo() {
console.log("2: ", typeof foo); // function
};
console.log("1: ", typeof foo); // undefined
x();
// Declaration
function bar() {
}
console.log("3: ", typeof bar); // function
&#13;
当function
制作被用作值时(例如,在if
中,或在作业的右侧等),它是一个表达式。如果它是独立的,它就是一个声明。