JS琐事 - 在条件内定义函数

时间:2017-05-29 07:31:59

标签: javascript

为什么此代码会打印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的翻译行为背后的逻辑是什么。

1 个答案:

答案 0 :(得分:2)

因为命名函数表达式中函数的名称未添加到表达式所在的作用域(与函数声明不同,其中名称​​ 添加到它发生的范围)。使用NFE时,名称仅在函数范围内。 if中的那个是非正式会员。 eval中的那个是声明。

示例:

&#13;
&#13;
// 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;
&#13;
&#13;

function制作被用作值时(例如,在if中,或在作业的右侧等),它是一个表达式。如果它是独立的,它就是一个声明。