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在上面所说的。看。