2012-09-25 40 views
1

以下代碼是從「JavaScript的通過實施例第二版」截取。我可以刪除關鍵字var

我覺得代碼

if (!e) var e = window.event; // Internet Explorer 

應該

if (!e) e = window.event; // Internet Explorer 

你覺得呢?這樣對嗎?或者,也許代碼應該保持原樣?

<html> 
<head> 
    <title>Mouse Coordinates</title> 
    <script type="text/javascript"> 
     function getCoords(e) { 
      var x = 0; // x and y positions 
      var y = 0; 
      if (!e) var e = window.event; // Internet Explorer 
      if (e.pageX || e.pageY) { // Firefox 
       x = e.pageX; 
       y = e.pageY; 
      } 
      else if (e.clientX || e.clientY) { 
       x = e.clientX + document.body.scrollLeft 
       + document.documentElement.scrollLeft; 
       y = e.clientY + document.body.scrollTop 
       + document.documentElement.scrollTop; 
      } 
      // x and y contain the mouse position 
      // relative to the document 
      alert(x + ", " + y); 
     } 
    </script> 
    </head> 
     <body> 
      <div style="background-color: aqua; position: absolute; top: 50px" 
       onmouseover="return getCoords(event);"> 
       <h1>Mouse positions are relative to the document, not the 
&lt;div&gt; container</h1> 
      </div> 
     </body> 
</html> 
+1

使用HTML屬性附加事件處理程序是*不是最佳做法 – danwellman

+0

@danwellman:它取決於上下文。 –

+0

@TimDown請提供一個可接受上下文的示例 – danwellman

回答

2

是的,你可以刪除該函數內部var語句。在功能

變量的聲明範圍在2種方法,無論是通過「變種」關鍵字,或者通過作爲參數被傳遞到該函數被定義。

+0

代碼函數getCoords(e){...}定義了一個參數e,所以我認爲代碼中的變量if(!e)e = window.event; // Internet Explorer仍然是局部變量,對吧? – HelloCW

+0

如果一個函數通過一個變量,那個變量就在該函數的範圍內聲明。它基本上與在函數範圍內的變量上使用'var'相同。 – Geuis

4

該代碼是正確的,但也可以在沒有var關鍵字的情況下使用。

由於e是函數的形式參數(無論是否傳遞),因此不需要聲明它var

在MSIE e未被傳遞,因此它將被賦予全局的window.event對象的值。

注意自身的var關鍵字確實覆蓋任何現有的值,它僅僅用來聲明在局部範圍內的變量。如果變量已經有一個值,那麼「提升」將聲明移動到範圍的頂部,但是保留原來的任務。

寫這篇的更慣用的方法是:

function getCoords(e) { 
    e = e || window.event; 
    ... 
} 
+0

即使刪除代碼if(!e)var e = window.event; // Internet Explorer,爲什麼? – HelloCW

+1

@ user828896我想在IE9.0 MS中最終符合W3C DOM3事件模型,並將該事件作爲參數傳遞給回調函數。 – Alnitak

+0

@Alnitak:沒錯。 –

-1

當你省略了var關鍵字,變量是在全球範圍內創建。因此,在這種情況下,如果您省略了var關鍵字,則可以創建一個全局變量e,該變量可以通過任何其他javascript函數進行讀取和更改。考慮到「e」是一個非常常見的標識符,這可能會導致一些非常意外的錯誤。

一般情況下,你應該總是使用var關鍵字。

+2

編號'e'正被傳遞給函數,因此定義它並設置其範圍。 – Geuis

+0

你確定嗎? 'e'已經被定義爲一個函數參數。 – Thilo

+2

@Salketer否,嚴格意思是如果'e'是_falsey_。 – Alnitak

0

是的,我會放棄var,因爲它重新定義了已經在同一範圍內建立的局部變量(憑藉作爲函數的參數)。

結果應該是一樣的,與var是多餘的,但它造成的混亂。

還要注意的是var工作在Javascript有點滑稽,因爲如果它出現在功能上,或其他任何地方,它會永遠之前影響整個範圍,甚至代碼也沒關係:

x = 12; // using the variable "before" it is declared works 
var x = x + 1; 

我會避免在條件塊(因爲它是如此混亂)。

0

var正在做什麼也沒有,可以在不影響任何瀏覽器的任何內容的情況下被刪除。具有相同名稱的函數參數的存在意味着已經在本地函數作用域中定義了該名稱的變量(即使其值爲undefined),在這種情況下,var被指定爲無操作。

所有這一切,我建議刪除它,因爲它的存在只會造成混淆。