Javascript JS琐事-在if条件中定义函数
为什么此代码打印的是Javascript JS琐事-在if条件中定义函数,javascript,Javascript,为什么此代码打印的是未定义的,而不是函数: if (function f(){}) { console.log(typeof f); } …当这一个按预期打印功能时: eval('function g(){}'); console.log(typeof g); (还有if(x=42)console.log(x);按预期打印42) 注意:我非常清楚这种代码是一种不好的做法,我知道大多数Linter也会拒绝它,因为他们应该。。。但我只是好奇Javascript解释器行为背后的逻辑是什么。
未定义的
,而不是函数
:
if (function f(){}) {
console.log(typeof f);
}
…当这一个按预期打印功能时:
eval('function g(){}');
console.log(typeof g);
(还有if(x=42)console.log(x);
按预期打印42
)
注意:我非常清楚这种代码是一种不好的做法,我知道大多数Linter也会拒绝它,因为他们应该。。。但我只是好奇Javascript解释器行为背后的逻辑是什么。因为命名函数表达式中的函数名不会添加到表达式出现的范围(与函数声明不同,函数声明中的名称会添加到它出现的范围)。对于NFE,名称仅在函数范围内。您的if
中的一个是NFE。eval
中的一个是声明
示例:
//NFE
var x=函数foo(){
console.log(“2:,typeof foo);//函数
};
console.log(“1:,类型foo);//未定义
x();
//声明
功能条(){
}
console.log(“3:,条形图类型);//函数
,因为命名函数表达式中的函数名称未添加到表达式出现的范围(与函数声明不同,函数声明中的名称添加到表达式出现的范围)。对于NFE,名称仅在函数范围内。您的if
中的一个是NFE。eval
中的一个是声明
示例:
//NFE
var x=函数foo(){
console.log(“2:,typeof foo);//函数
};
console.log(“1:,类型foo);//未定义
x();
//声明
功能条(){
}
console.log(“3:,条形图类型);//函数
我认为,因为您定义了一个匿名函数(因为您将它包装在()
中),所以函数f
只存在于那些()
中。主要区别在于f()
是在表达式中定义的,而g()
是在语句中定义的。请尝试if(f=function(){})
然后看看会发生什么。这可能会给你一些额外的见解。请参见@JeffHuijsmans括号是if语句语法的一部分,它们不会创建作用域。@JJJ感谢您的澄清!我认为,因为您定义了一个匿名函数(因为您将它包装在()
),所以函数f
只存在于那些()
中。主要区别在于f()
是在表达式中定义的,而g()
是在语句中定义的。请尝试if(f=function(){})
,看看会发生什么。这可能会给你一些额外的见解。请参见@JeffHuijsmans括号是if语句语法的一部分,它们不会创建作用域。@JJJ感谢您的澄清!啊,我完全错过了这里的“函数声明”与“函数表达式”之争。。。谢谢你清理它!啊,我完全错过了这里的“函数声明”与“函数表达式”之争。。。谢谢你清理它!