为什么这段 JavaScript 代码会返回错误?

问题描述

我知道在 JavaScript 中只提升了函数声明,这意味着它应该在运行函数 sum 后打印 30。

但是它说diff没有定义,不应该被提升吗?

sum(10,20);
diff(10,20);
    
function sum(x,y) {
  return x + y;
}
    
let diff = function(x,y) {
  return x - y;
} 

解决方法

是的,let 和 const 被提升,但在运行时评估实际声明之前您无法访问它们。

,

您在初始化之前正在访问该函数。

所以这应该可行,

let diff = function(x,y) {
  return x - y;
} 

function sum(x,y) {
  return x + y;
}

console.log(sum(10,20));
console.log(diff(10,20));

,

let diff 将提升,但在函数 diff(10,20); 将被调用的那一刻,变量 diff 不会与函数一起定义。 谷歌这个话题函数声明 vs 函数表达式

,

这是因为正如你所说,只有函数声明被提升,而不是函数表达式(将无名函数分配给变量)。以下代码有效:

sum(10,20);
diff(10,20);
    
function sum(x,y) {
  return x + y;
}
    
function diff(x,y) {
  return x - y;
} 

要按照您所做的方式声明 diff,您必须将其提升到代码的顶部:

let diff = function(x,y) {
  return x - y;
} 

sum(10,y) {
  return x + y;
}
    

,

因为Function Expressions不像Function Declarations那样被吊起来

JavaScript 中的函数表达式是 未提升,与函数声明不同。你不能使用功能 创建表达式之前:

console.log(notHoisted) // undefined
//  even though the variable name is hoisted,the definition isn't. so it's undefined.
notHoisted(); // TypeError: notHoisted is not a function

var notHoisted = function() {
   console.log('bar');
};

https://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Operators/function#function_expression_hoisting


如果您想将其吊起,则需要使用 Function Declaration