Javascript-提升中的优先级

Javascript-提升中的优先级,javascript,function,hoisting,Javascript,Function,Hoisting,在提升过程中,变量优先于函数定义还是相反?请参阅下面的代码: function a() { var x = 10; function x() { return 20; } return x; } 这不是一个优先于另一个的问题(有优先权发生,但这在很大程度上只是一个语义问题) 这里重要的是变量声明的赋值部分不被提升,而整个函数定义被提升 注意根据raina77ow的回答,我最初的部分假设似乎是错误的。函数在变量声明之前被提升,但最终效果是相同的

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

function a()
{
    var x = 10;

    function x() {
        return 20;
    }

    return x;
}

这不是一个优先于另一个的问题(有优先权发生,但这在很大程度上只是一个语义问题)

这里重要的是变量声明的赋值部分不被提升,而整个函数定义被提升

注意根据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;
}
function a() {
    function x() {
        return 20;
    }
    var x = 10;
    return x;
}
function a() {
    var x = function x() { return 20; };
    var x;
    console.log(x);
    x = 10;
    console.log(x);
}
x=10
发生在所有提升完成后,因此该值保留在
x
中。
为了响应@thefourtheye的请求(我认为这是他/她所要求的),如果您的原始功能如下所示:

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;
}
function a() {
    function x() {
        return 20;
    }
    var x = 10;
    return x;
}
function a() {
    var x = function x() { return 20; };
    var x;
    console.log(x);
    x = 10;
    console.log(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() {  // hoisted function declaration/definition
        return 20;
    };
    var x;                  // hoisted variable declaration
    x = 10;                 // unhoisted part of variable declaration
    return x;
}
function a() {
    function x() {
        return 20;
    }
    var x = 10;
    return x;
}
function a() {
    var x = function x() { return 20; };
    var x;
    console.log(x);
    x = 10;
    console.log(x);
}

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

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

请交换
var
函数
,并对其进行推理。@thefour他们编辑了我的答案。这就是你想要的吗?我不确定我是否理解了您的请求。
这并不是说变量在提升过程中优先
-那么,函数定义优先,对吗?@JLRishe-那么,函数定义将分解为函数运算符。但这种崩溃是像你说的那样发生的,还是会像VarX一样发生;x=函数x()@第四,不,两者都不一定优先。关键是变量声明和函数定义的表达方式不同。对于变量声明,只提升声明部分,而对于函数定义,提升整个函数。已经定义了x。它的代码很混乱,不需要修改。在代码回顾中,我会让程序员改变这一点。变量被提升到作用域的顶部,然后分配到调用它们的位置。在ECMAScript 5.1中,没有关于提升的讨论。因此,您不应该依赖于任何特定的实现。最佳实践是在作用域顶部声明变量,然后在声明后初始化。