什么是JavaScript中的提升?

62 阅读2分钟

简要解释一下,在JavaScript编程语言中,提升的意思是什么?

在执行你的代码之前,JavaScript会对其进行解析,并将其发现的每个函数和变量声明添加到自己的内存中,并将其保存在内存中。这就是所谓的提升

我们对函数声明和函数表达式有一些不同的行为。

对于函数声明,我们可以在它被定义之前调用一个函数,而我们的代码就可以工作。在其他情况下,我们会出现错误。

一个一般的经验法则是,在使用函数、变量、对象和类之前,总是先定义它们,以避免出现意外。

假设我们有一个函数。

function bark() {
  alert('wof!')
}

由于提升,我们在技术上可以在它被声明之前调用bark()

bark()
function bark() {
  alert('wof!')
}

对于函数,这只发生在函数的声明中。就像上面的情况一样。

对于函数表达式则不然

这是一个函数表达式。

bark()
var bark = function() {
  alert('wof!')
}

在这种情况下,var 声明被吊起,并以undefined 为值进行初始化,类似这样的情况。

var bark = undefined
bark()
bark = function() {
  alert('wof!')
}

运行这段代码会得到一个TypeError: bark is not a function 的错误。

const 和 声明也被挂起,但它们不像 那样被初始化为未定义。let var

const bark = function() {
  alert('wof!')
}

let bark = function bark() {
  alert('wof!')
}

在这种情况下,如果你在声明之前调用bark() ,会给你一个ReferenceError: Cannot access 'bark' before initialization 的错误。

同样的情况也会发生在任何其他将对象或类分配给变量的表达式上

类声明的工作方式与letconst 声明类似:它们被吊起,但没有被初始化,在声明之前使用一个类将会产生一个ReferenceError: <Class> is not defined 错误。