JS如何使用其代码?

时间:2012-01-24 17:55:16

标签: javascript function

  

可能重复:
  Why does second function declaration win even though I return before it?

我想了解一件事。在实现任何函数或输出之前,JS是否首先通过代码来初始化变量,函数等?我的意思是看起来它经历了两次代码 - 一次初始化,并且只是第二次开始做某事。正确?

我有这样的代码:

alert( (function f() {
    function f() { return 1 }

    return f();

    function f() { return 2 }
})() );

输出为2.因此,如果它从第一次开始直接实现代码,则输出将为1.但是,只要输出为2,它首先检查代码,然后才开始使用它。我是对的吗?

2 个答案:

答案 0 :(得分:4)

Javascript确实“悬挂”。这基本上意味着任何var namefunction name()被提升到它声明的任何函数体的顶部。所以你的例子可以像这样重写,它遵循提升规则。

var f;
f = function() {
  var f;
  f = function() { return 1; };
  f = function() { return 2; }; // hoisted!
  return f();
};
alert(f());

这里发生的是在外部范围内,您创建一个局部变量f。然后为其分配一个函数,然后执行该函数。

在函数内部,我们创建一个新的局部变量f,其中阴影外部变量,使其无法访问。我们现在有一个完全不同的f只存在于这个内部函数中。我们为它分配了第一个函数,然后是第二个提升函数。现在我们执行我们的函数体。

因此,由于提升,您几乎不想使用function name() {}语法来创建函数。相反,使用var name = function() {}创建函数。

它更易于控制和理解,因为声明变量并为其赋值,现在是两个独立的操作。变量声明仍然被提升,但在它到达为其分配函数的代码行之前它不会有值,这通常是你真正想要的。

答案 1 :(得分:1)

首先处理

varfunction。这是我将函数定义为
的主要原因 f = function()代替function f() - 这样我确切地知道在哪里定义了什么。