为什么JavaScript函数在定义之前可以访问

Why can JavaScript functions to be accessed Before they are defined?

本文关键字:访问 定义 JavaScript 函数 为什么      更新时间:2023-10-22

可能重复:
为什么我可以在函数之前使用它';在Javascript中定义了什么?

正如预期的那样,由于未定义Foo,以下代码引发错误:

window.Foo = Foo;

同样正如预期的那样,这引发了相同的错误:

window.Foo = Foo;
Foo = function() {
    ...
};

奇怪的是,这还不错:

window.Foo = Foo;
function Foo(){
    ...
};

这怎么可能?JavaScript不是逐行解释的吗?

吊装只是故事的一部分。

首先,解释吊装:

在JavaScript程序中使用var时,需要声明一个变量。只要在JS作用域中声明了该变量,它就会被提升到该作用域的顶部。JavaScript只有全局或函数作用域;在功能的情况下

function hoistAway() {
  console.log(a);
  var a = 5;
}

相当于

function hoistAway() {
  var a;
  console.log(a);
  a = 5;
}

正如您所看到的,声明被挂起,但初始化没有。因此,此代码将在控制台上记录undefined,而不是5。然而,如果存在a,则会感到满意。

如果不使用var,则声明不是显式的,因此不会被挂起。因此:

function hoistAway() {
  console.log(a);
  a = 5;
}

将导致一条错误消息。

在您的示例中:

window.Foo = Foo;

Foo从未被声明,所以您会得到一个错误。

window.Foo = Foo;
Foo = function() {
    ...
};

同样,Foo没有被宣布,所以没有吊装。备案:

window.Foo = Foo;
var Foo = function() {
    ...
};

不会抛出错误。然而,只有申报被悬挂,所以如果你做了类似的事情

var bob = {};
bob.Foo = Foo;
var Foo = function() {
    ...
};

则CCD_ 7将是CCD_。window.Foo = Foo的特殊情况很奇怪,因为Foowindow.Foo在全局范围内是相同的。

最后:

window.Foo = Foo;
function Foo(){
    ...
};

有效,因为函数声明(与函数表达式相反)也被挂起;名称和定义都被挂起了,所以这将按预期工作。

首先解析脚本,允许您的代码调用稍后定义的函数。