2015-10-16 133 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