2015-10-16 155 views
3

嗨,我有一段代码。当我删除相同代码的非相关部分时,我对值x1的更改感到困惑。我搜查了一下,然后我才知道这与吊装有关。但即使对我来说,提升概念的价值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

回答

1

所有变量和函数声明都会被“悬挂”或移动到其范围的顶部。 xundefined值是由于var x语句移到main的顶部而造成的,但= 30的赋值没有。

所以,你的代码将更多这样的:

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

你可以阅读更多关于起重这里:JavaScript Scoping and Hoisting

2

所以这里发生了什么是一个常见的问题。

这是最简单的方法。当您在main函数中设置var x = 30时,实际上您正在重新定义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。

由于这是有点一个非常有趣的Java脚本如何执行时,考虑下面的代码范围,其产出得到充分的思想

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);

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

+0

他们实际上重新定义VAR范围X = 30;他们把原来的x签到20就好了。 – EasyBB

+1

不确定你是否认为“杀死范围”是正确的。至少“删除它的范围”是错误的,如果至少有可怕的误导。只有多个作用域,现在在不同作用域中有*两个变量*,*名称相同。 – Bergi

+0

@Bergi - 你是对的,为将来的访问者编辑 – Jesse