这个对象的范围是什么

时间:2010-09-13 13:16:13

标签: javascript scope

我有以下代码片段,它使用'event' 我的开发人员认为'var event'的范围仅限于'if'条件。 真的吗。我怎样才能使这个代码变得更好

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 个答案:

答案 0 :(得分: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'语句。

  3. 我担心这里还有一个问题。病情的目的是什么?参数objevent有什么关系?现代浏览器将事件对象作为参数传递给事件处理函数,但是some do not。为避免此问题,倾向于使用以下模式:

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

    * 注意:JavaScript 1.7中引入了let statement,它在函数内部提供了块范围。目前it's only supported in Firefox

答案 1 :(得分: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
    }
}

BTW,您为什么eval document.${formName}

答案 2 :(得分:2)

JavaScript没有块作用域(catch块内的异常变量除外),因此在您的情况下,event变量具有函数作用域。您可以做的最好的事情是使用新值重新分配event,或者使用其他变量名称。

相关问题