Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS琐事-在if条件中定义函数_Javascript - Fatal编程技术网

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感谢您的澄清!啊,我完全错过了这里的“函数声明”与“函数表达式”之争。。。谢谢你清理它!啊,我完全错过了这里的“函数声明”与“函数表达式”之争。。。谢谢你清理它!