javascript - var關鍵字和何時使用它( 或者省略它)?

  显示原文与译文双语对照的内容

注意 : 這個問題是從ECMAScript版本 3或者 5的角度提出的。 在 ECMAScript 6的發行版中引入新特性時,答案可能會過時。

var 關鍵字在Javascript中的具體功能是什麼,它之間的區別是:


var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

還有:


someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

什麼時候使用哪一個,以及為什麼?

时间:

如果你在全局作用域中,則沒有差異。

如果你在函數中,"var"將創建一個局部變數,"無 var"會查找作用域鏈,直到找到變數或者點擊全局作用域( 此時它將創建它):


//These are both globals
var foo = 1;
bar = 2;

function()
{
 var foo = 1;//Local
 bar = 2;//Global

//Execute an anonymous function
 (function()
 {
 var wibble = 1;//Local
 foo = 2;//Inherits from scope 上面 (creating a closure)
 moo = 3;//Global
 }())
}

如果你沒有執行賦值,那麼你需要使用 var:


var x;//Declare x

說這是"本地和全局 "的區別不是完全準確的。

最好把它看作是"最近本地和"之間的差異。 最近的可以是全局的,但並不總是這樣。


/* global scope */
var local = true;
var global = true;

function outer() {
/* local scope */
 var local = true;
 var global = false;

/* nearest scope = outer */
 local =!global;

 function inner() {
/* nearest scope = outer */
 local = false;
 global = false;

/* nearest scope = undefined */
/* defaults to defining a global */
 public = global;
 }
}

在瀏覽器中執行Javascript時,所有代碼都被一個帶有語句的語句包圍,如下所示:


with (window) {
//Your code
}

關於 with - MDN的更多信息

在all,因為 var 聲明一個變數在當前作用域,沒有區別聲明 var裡面窗口然後不聲明上面,

區別則在於不直接放到窗口,比如 出現在函數中也可以用在塊。

使用 var 可以隱藏具有相同名稱的外部變數。 通過這種方式,你可以模擬一個"專用的"變數,但這是另一個主題。

經驗法則是總是使用 var,否則你就會面臨引入微妙的Bug的風險。

編輯:在收到評論之後,我想強調以下幾點:

  • var 在當前範圍內聲明一個變數
  • 全局作用域是 window
  • 在全局作用域( 窗口) 中不使用 var 隱式聲明 var
  • 使用 var 是一樣的作為省略it,將變數聲明在全局範圍中
  • 將變數聲明的作用域不同於窗口中使用 var並不是同樣的事情作為在聲明變數時不var
  • 總是顯式聲明 var,因為它是良好的實踐

你應該總是 改用 var 關鍵字來聲明變數。 為什麼是有原因的最佳編碼實踐應該足夠在本身,而是在 var 關鍵字聲明變數時不意味著它被聲明在全局 範圍所暗示"全局) ( 這樣一個變數叫做"中。? Douglas Crockford 建議從不使用隱含的全局變數,並根據 Apple JavaScript編碼指南:

沒有 var 關鍵字創建的任何變數都是在全局作用域創建的,並且在 function returns (because it doesn't go out of scope) 中不是垃圾收集時,它表示內存泄漏的機會。

因此,簡而言之,總是使用 var 關鍵字聲明變數。

下面是一個很好的例子,你可以使用 var 來避免聲明局部變數:


<script>
one();

function one()
{
 for (i = 0;i <10;i++)
 {
 two(i);
 alert(i);
 }
}

function two()
{
 i = 1;
}
</script>

( i 在循環的每次迭代時被重置,因為它不是在 for 循環中局部聲明,而是全局地聲明)

...