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