2012-09-25 37 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被指定为无操作。

所有这一切,我建议删除它,因为它的存在只会造成混淆。