2015-08-27 81 views
3

全部:JS引擎如何在條件塊中處理變量聲明?

我有一個關於變量聲明的問題,如果我在if塊中聲明變量,當JS引擎遇到那條線時,引擎如何設置變量?

我知道這是聲明變量可怕的方式,但只是好奇JS引擎是如何工作的吧:

if(trueSituation){ 
    var a_variable = true; 
}else { 
    var another_variable = false; 
} 

感謝

+0

你是什麼意思「你怎麼就知道如何設置變量?」你的意思是「它如何知道如何設置該變量?」 –

+0

@AndreaCasaccia對不起,我的錯字。 – Kuan

回答

6

JavaScript有一個名爲「可變懸掛」一詞。當你的代碼實際執行中,所有的var小號被拉外圍函數的頂部:

function foo() { 
    var a_variable; 
    var another_variable; 
    if(trueSituation) { 
     a_variable = true; 
    }else { 
     another_variable = false; 
    } 
} 

此前if/else,可以console.log(a_variable)作爲特殊值undefined。作爲一個方面說明,ES6包含一個名爲let的構造,它允許使用更傳統的塊範圍,然而我相信它仍然將變量提升到塊的頂部。

+0

感謝您的解釋。我有點想知道這個varibale會升高到什麼水平?如果沒有函數範圍,它會到達第一個函數範圍還是全局 – Kuan

+0

@Kuan:'var'提升到函數範圍,'let'提升到阻止範圍 – Bergi

+0

@Bergi謝謝,我想知道是否沒有定義函數並且有多個

4

在JavaScript中,變量聲明被提升到其包含範圍的頂部。

在你的榜樣

所以,這樣的:

if(trueSituation){ 
    var a_variable = true; 
} else { 
    var another_variable = false; 
} 

…成爲本:

var a_variable, another_variable; 

if(trueSituation){ 
    a_variable = true; 
} else { 
    another_variable = false; 
} 

兩個變量都聲明,但是隻有一個成爲已定義的基礎上,trueSituation的感實性。

+0

感謝您解釋,我有點想知道varibale會被懸掛在什麼級別?如果沒有函數作用域,它會到達第一個函數作用域還是全局函數 – Kuan

+0

如果在函數之外,或者在其直接函數的範圍內,它將處於全局作用域。 –

+0

謝謝我想知道是否沒有定義功能,並且存在多個

  • 11. BEGIN塊和變量聲明
  • 12. 在短變量聲明中從不同塊中重新聲明變量
  • 13. 如何處理saml:在WCF中聲明?
  • 14. 聲明和使用Windows批處理文件(.BAT)中的變量
  • 15. 在php文件中聲明變量,將在JS/jQuery中訪問
  • 16. 變量聲明有條件語法
  • 17. nodej EJS條件變量聲明
  • 18. js中變量聲明的問題
  • 19. Ruby如何處理未聲明的變量而不是php?
  • 20. 如何處理必須聲明scalare變量例外
  • 21. 函數級鏈接如何處理在文件級聲明的變量?
  • 22. 如何在類中聲明變量?
  • 23. 如何在XSLT中聲明變量?
  • 24. 如何在vb.net中聲明變量?
  • 25. 如何在PostgreSQL中聲明變量
  • 26. 如何在javascript中聲明變量
  • 27. 如何在Swift中聲明volatile變量
  • 28. 如何在svg中聲明變量
  • 29. 如何在MySql中聲明變量?
  • 30. 如何在JSP中聲明int變量?