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

时间:2012-07-16 17:37:29

标签: javascript function syntax

  

可能重复:
  Why can I use a function before it's defined in Javascript?

正如所料,以下代码引发错误,因为未定义Foo

window.Foo = Foo;

同样如预期的那样,这会引发同样的错误:

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

奇怪的是,这很好用:

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

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

2 个答案:

答案 0 :(得分:4)

吊装只是这里故事的一部分。

首先,解释吊装:

在JavaScript程序中使用var时,声明一个变量。无论在JS范围内声明该变量,它都会被提升到该范围的顶部。 JavaScript只有Global或Function范围;在函数的情况下

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() {
    ...
};

然后bob.Foo将是undefinedwindow.Foo = Foo的特殊情况很奇怪,因为Foowindow.Foo在全局范围内是相同的。

最后:

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

有效,因为函数声明(与函数表达式相对)也会被提升;名称和定义都被提升,因此这将按预期工作。

答案 1 :(得分:0)

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