【问题标题】:Function statement vs function expression weird behaviour函数语句与函数表达式的奇怪行为
【发布时间】:2017-07-16 07:48:08
【问题描述】:

var a = function b() {

};

console.log(typeof b); //gives undefined
console.log(typeof a); //gives function

为什么两个输出不同?

我理解函数表达式和函数语句之间的区别,但无法理解上面的输出。

据我所知,javascript 使var a 指向此处分配给命名函数 b 的内存。在这种情况下,typeof b 也应该返回 function 但它返回 undefined

有什么解释吗?

【问题讨论】:

标签: javascript


【解决方案1】:

因为命名函数表达式的名称范围是表达式。

var a = function b() {
    console.log(typeof b); //gives function
    console.log(typeof a); //gives function
};

console.log(typeof b); //gives undefined
console.log(typeof a); //gives function

a();

【讨论】:

  • 为了 100% 准确,涉及两个范围。首先是整个函数表达式的作用域;第二个是大括号之间的。名称的范围是前者。换句话说,以下是有效的,如果没用的话:a = function b(arg = b) { };.
【解决方案2】:

为什么两个输出不同?

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

您可能希望b 在表达式所在的范围内,因为对于函数声明来说确实如此:

function b() {
}
console.log(typeof b);

但这只是函数声明和函数表达式处理方式的区别。

【讨论】:

  • 它只在函数的范围内你如何在这里定义“内部”?
  • 我会说within的意思是function之后的大括号之间
  • @gyre:不仅是正文,还有参数列表。整个函数。
  • 当然,假设我们说的是 ES6。不确定这是 OP 的意图,但我知道你的意思。
  • @gyre: :-) 可能不会。但这就是 torazaburo 上面所说的。
【解决方案3】:

function b(){

}

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

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

function(){

};

这只是一个函数文字,你可以像这样分配给一个变量:

var a = function(){

};

【讨论】:

  • 这没有回答问题。
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多