是什么使函数表达式返回值?

时间:2018-06-21 05:18:06

标签: javascript

我知道函数表达式解析为一个值(不要与它们返回的结果混淆(因为其他表达式在另一个SO question中为我清除了)-默认情况下所有函数都返回undefined),因此,“表达式”一词不存在,而函数声明则不是。但是我不确定到底是什么导致了这种差异。我最初的猜测是它是变量赋值(赋值运算符右边总是一个表达式[我认为]),但函数表达式不需要变量赋值。据我所知,它们与函数声明之间的唯一其他区别(除了解析为一个值)是您可以在函数表达式中省略函数名称。我将不胜感激。

1 个答案:

答案 0 :(得分:0)

引用:https://javascript.info/function-expressions-arrows#function-expression-vs-function-declaration

函数表达式在执行执行时创建,并且从那时起就可用。

一旦执行流转到分配的右侧,让sum = function…–我们开始,该函数将创建,并且可以从现在开始使用(分配,调用等)。

函数声明不同。

在整个脚本/代码块中都可以使用函数声明。

换句话说,当JavaScript准备运行脚本或代码块时,它首先在其中查找函数声明并创建函数。我们可以将其视为“初始化阶段”。

在处理完所有的函数声明之后,执行继续。

因此,可以在定义之前调用被声明为函数声明的函数。

sayHi("John"); // Hello, John

function sayHi(name) {
  alert( `Hello, ${name}` );
}

函数声明sayHi是在JavaScript准备启动脚本时创建的,并且在脚本的各处都可见。

…如果它是一个函数表达式,那么它将无法正常工作:

sayHi("John"); // error!

let sayHi = function(name) {  // (*) no magic any more
  alert( `Hello, ${name}` );
};

函数表达式在执行到达时创建。那只会在行(*)中发生。为时已晚。

在代码块中进行功能声明时,该代码块内的任何地方都可见。但不是在外面。

有时候很容易声明仅在该块中才需要的局部函数。但是该功能也可能会引起问题。

例如,假设我们需要根据运行时获得的age变量声明一个函数welcome()。然后我们计划稍后再使用。

let age = prompt("What is your age?", 18);

// conditionally declare a function
if (age < 18) {

  function welcome() {
    alert("Hello!");
  }

} else {

  function welcome() {
    alert("Greetings!");
  }

}

// ...use it later
welcome(); // Error: welcome is not defined

那是因为功能声明仅在其所在的代码块内部可见。

这是另一个示例:

let age = 16; // take 16 as an example

if (age < 18) {
  welcome();               // \   (runs)
                           //  |
  function welcome() {     //  |
    alert("Hello!");       //  |  Function Declaration is available
  }                        //  |  everywhere in the block where it's declared
                           //  |
  welcome();               // /   (runs)

} else {

  function welcome() {     //  for age = 16, this "welcome" is never created
    alert("Greetings!");
  }
}

// Here we're out of curly braces,
// so we can not see Function Declarations made inside of them.

welcome(); // Error: welcome is not defined

我们应该怎么做才能使欢迎在if之外可见?

正确的方法是使用函数表达式,并将if分配给在if外部声明并具有适当可见性的变量。

现在它可以正常工作了:

let age = prompt("What is your age?", 18);

let welcome;

if (age < 18) {

  welcome = function() {
    alert("Hello!");
  };

} else {

  welcome = function() {
    alert("Greetings!");
  };

}

welcome(); // ok now

或者我们可以使用问号运算符进一步简化它:

let age = prompt("What is your age?", 18);

let welcome = (age < 18) ?
  function() { alert("Hello!"); } :
  function() { alert("Greetings!"); };

welcome(); // ok now