Javascript - 吊装的优先权

时间:2014-12-25 06:14:54

标签: javascript function hoisting

在提升中,变量优先于函数定义还是反过来?请参阅以下代码:

function a()
{
    var x = 10;

    function x() {
        return 20;
    }

    return x;
}

2 个答案:

答案 0 :(得分:2)

这不是一个优先于另一个的问题(优先发生,但这主要只是语义问题)。

这里重要的是变量声明的赋值部分悬挂,而整个函数定义

注意根据raina77ow的回答,似乎我原先假设的一部分是错误的。函数在变量声明之前被提升,但净效果是相同的。

吊起后,你的功能会这样:

function a()
{
    var x = function x() {  // hoisted function declaration/definition
        return 20;
    };
    var x;                  // hoisted variable declaration
    x = 10;                 // unhoisted part of variable declaration
    return x;
}

x = 10在所有提升完成后发生,因此这是x中保留的值。

<小时/> 要回应@ thefourtheye的请求(我认为这是他/她要求的),如果您的原始函数看起来像这样:

function a() {
    function x() {
        return 20;
    }
    var x = 10;
    return x;
}

然后在提升后,它看起来像这样(与上面相同):

function a() {
    var x = function x() {  // hoisted function declaration/definition
        return 20;
    }
    var x;                  // hoisted variable declaration (does nothing)
    x = 10;                 // unhoisted variable assignment
    return x;
}

最后一个例子,试试这个:

function a() {
    console.log(x);
    var x = 10;
    console.log(x);
    function x() { return 20; };
}

调用时,打印出:

function x() { return 20; }
10

原因是吊装导致功能表现如下:

function a() {
    var x = function x() { return 20; };
    var x;
    console.log(x);
    x = 10;
    console.log(x);
}

答案 1 :(得分:1)

您的代码将等于以下内容:

function a() {
  var x;
  function x() { // this function is assigned to variable indicator "x"
    return 20;
  }
  x = 10; // this overrides the variable indicator "x"
  return x;
}

所以当你调用这个函数时:

a() // 10