可变提升示例

时间:2015-10-16 03:21:19

标签: javascript variables hoisting lexical-scope

您好我有一段代码。当我删除相同代码的非相关部分时,我对值x1的更改感到困惑。我搜索了一下,我发现它与吊装有关。但即使对我来说,提升概念的价值仍然不明确。有人可以告诉我这个吗?

var x = 10;               
    
function main() {
  document.write("<br>x1 is " + x);
  x = 20;
  if (x > 0) {
    var x = 30;
    document.write("<br>x2 is " + x);
  }
  var x = 40;
  var f = function(x) { 
    document.write("<br>x3 is " + x); 
  }
  f(50);
}

main();

此代码的输出为:

  

x1未定义
  x2是30
  x3是50

如果我将此代码更改为:

        
var x = 10;

function main() {
  document.write("<br>x1 is " + x);  
}

main();

输出结果为:

  

x1是10

2 个答案:

答案 0 :(得分:2)

所以这里发生的事情是一个常见的陷阱。

最简单的方法是。在var x = 30函数中设置main时,实际上是在重新定义var x = 10在此函数中使用的范围。这与Javascript的执行方式和范围有关。

通过在函数内定义x,x的范围已更改。下面是我的意思的示例和适用的代码版本

示例:

var test = 'test';
function run(){
    console.log(test);
    var test=1;
}

您的代码已更新:

var x = 10; 
        function main() {
            console.log("<br>x1 is " + x);
            x = 20;
            if (x > 0) {
                x = 30;
                console.log("<br>x2 is " + x);
            }
            x = 40;
            var f = function(x) { console.log("<br>x3 is " + x); }
            f(50);
        }
        main();

好问题btw。

由于这是Javascript执行方式的一个非常有趣的范围,请考虑以下代码及其输出以获得完整的想法

var test = 'test';

function run(){
  console.log(test);
  test=1;
  console.log(test);
  var test=2;
  console.log(test);
}

console.log(test);

run();

console.log(test);

非常有趣,看看这是如何反应的。

答案 1 :(得分:1)

所有变量和函数声明都被提升了#34;或者移到他们的范围的顶部。导致undefined的{​​{1}}值是因为x语句被移动到var x的顶部,但作业main没有。

因此,您的代码将更像这样:

= 30

您可以在此处详细了解吊装:JavaScript Scoping and Hoisting