2010-09-13 77 views
3

我有下面的代码片断,它使用'事件' 我的开发人员争辩说'var事件'的范围被限制为'如果'条件。 这是真的。我怎样才能使这是一个更好的代码这个对象的范围是什么

function prepForDrag(obj, event) {  
    if(event= "undefined"){ 
     var event=obj || window.event; 
    } 
    if (event.altKey) { 
     showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);  
     var thisForm = eval('document.${formName}'); 
     // ... 
     enableDragState(obj); 
     disableClickEditHandler(obj); ## remove 'normal' line sched click handling in dd mode 
    } 
    } 
+3

这篇文章将是有趣的:http://stackoverflow.com/questions/3684923/javascript-variables-declare-outside-or-inside-loop/ – spender 2010-09-13 13:22:23

回答

10

这是不正确的。在JavaScript中有无块范围,只有功能范围*。在函数中引入的所有变量都被提升到函数的顶部。

所以这个代码:

function prepForDrag(obj, event) { 
    if (event = "undefined") { 
     var event = obj || window.event; 
    } 
    // ... 
} 

得到一定程度的解释是这样的:

function prepForDrag(obj, event) { 
    if (event = "undefined") { 
     event = obj || window.event; 
    } 
    // ... 
} 

由于Marcel Korpel的指出,声明变量event在这种情况下没有必要,因为event已经是一个局部变量因为它是一个函数参数。有关更详细的信息,请阅读Ben Cherry的文章JavaScript Scoping and Hoisting

不过在代码中还有两个额外的问题。

  1. 在此条件下,你使用的=赋值运算符,而不是==比较操作。所以病情总是评估为真。

  2. 如果要检查是否给出函数参数,请使用typeof event == 'undefined'语句。

我恐怕这里还有一个问题。这种情况的目的是什么?请问objevent有什么关系?现代浏览器将事件对象作为参数传递给事件处理函数,但是some do not。为了避免该问题,下面的模式一般用:

function prepForDrag(e) { 
    var event = e || window.event; 
    // ... 
} 

* NB:有在JavaScript 1.7,其提供内部功能块范围引入let statement。目前it's only supported in Firefox

+0

这仍然是不完全正确的:因为'事件'已经一个给'prepForDrag'的参数,它已经具有本地范围,并且不需要使用'var'声明变量。你最后一个标准化Event接口的例子是不正确的:Event接口作为* first *参数传递给一个事件处理程序,所以在这种情况下'obj'将保存Event接口,'e'永远不会。 – 2010-09-13 14:18:33

+0

@Marcel Korpel:你是对的。感谢您指出。 – 2010-09-13 14:38:54

2

JavaScript没有块范围(除catch块中的异常变量),所以在你的情况,event变量函数范围内。您可以做的最好的方法是使用新值重新指定event,或者可以使用其他变量名称。

6

由于event已经是prepForDrag的一个参数,其范围是本地的功能

但你if条件是错误的:

if(event= "undefined") 

这就赋予"undefined"event和计算结果为true。你或许应该使用

if (typeof event == "undefined") 

或(我想你想要的是)

function prepForDrag(event) { 
    event = event || window.event; 
    if (event.altKey) { 
     showShiftEditable(objCurrentEditRow, nCurrentEditableShift, lCurrentEditableBreak, true);  
     var thisForm = eval('document.${formName}'); 
     ................................ 
     enableDragState(obj); 
     disableClickEditHandler(obj); // remove 'normal' line sched click handling in dd mode 
    } 
} 

顺便说一句,你为什么eval荷兰国际集团document.${formName}

+0

@Korpel:这是非常古老的(5年)code.never接触/改造,除非面临问题。这一个是FF兼容性问题。因此,评估基本上是阅读表格数据,当然这些数据很差劲:-( – GustyWind 2010-09-14 12:39:54