Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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 函数语句与函数表达式奇怪的行为_Javascript - Fatal编程技术网

Javascript 函数语句与函数表达式奇怪的行为

Javascript 函数语句与函数表达式奇怪的行为,javascript,Javascript,var a=函数b(){ }; 控制台日志(类型b)//给出未定义的 控制台日志(a型)//给出函数,因为命名函数表达式的名称的作用域是表达式 var a=函数b(){ console.log(typeof b);//给出函数 console.log(typeof a);//给出函数 }; 控制台日志(类型b)//给出未定义的 控制台日志(a型)//发挥作用 a()带有 function b(){ } 您可以声明一个名为b的函数。此语句没有返回值,因此返回值未定义 要声明匿名函数,必须在声

var a=函数b(){
};
控制台日志(类型b)//给出未定义的

控制台日志(a型)//给出函数
,因为命名函数表达式的名称的作用域是表达式

var a=函数b(){
console.log(typeof b);//给出函数
console.log(typeof a);//给出函数
};
控制台日志(类型b)//给出未定义的
控制台日志(a型)//发挥作用
a()带有

function b(){

}
您可以声明一个名为
b
的函数。此语句没有返回值,因此返回值未定义

要声明匿名函数,必须在声明中省略函数名,如下所示:

function(){

};
这只是一个函数文本,可以分配给如下变量:

var a = function(){

};
为什么这两种输出有差异

您正在为名为
b
的函数获取函数表达式,并将其分配给名为
a
的变量。这意味着
a
在表达式出现的范围内,但
b
不在表达式出现的范围内;它只在函数的范围内。(整个功能,包括参数列表;最后一部分仅与ES2015+相关,而与ES5及更早版本无关:您可以使用
b
作为默认参数的值。)

您可能希望
b
在表达式所在的范围内,因为函数声明是这样的:

函数b(){
}

控制台日志(类型b)这并不能回答问题。100%准确地说,有两个作用域。第一个是整个函数表达式的范围;第二个是在花括号之间。名称的范围是前者。换言之,如果没有用处,以下内容是有效的:
a=function b(arg=b){}。它只在函数的范围内。你如何定义“内”呢?我想说的是
函数之后的大括号之间的内指:不仅仅是主体,还有参数列表。整个函数。当然,假设我们说的是ES6。我不确定这是OP的意图,但我知道你的意思。@gyre::-)可能不是。但这正是torazaburo在上面所说的。看。