Javascript 这个对象的范围是什么

Javascript 这个对象的范围是什么,javascript,scope,Javascript,Scope,我有以下使用“event”的代码片段 我的开发伙伴们认为,“var事件”的范围仅限于“if”条件。 这是真的吗。我怎样才能使它成为更好的代码 function prepForDrag(obj, event) { if(event= "undefined"){ var event=obj || window.event; } if (event.altKey) { showShiftEditable(objCurrentEdi

我有以下使用“event”的代码片段 我的开发伙伴们认为,“var事件”的范围仅限于“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
    }
  }

JavaScript没有块作用域(除了
catch
块中的异常变量),因此在您的情况下,
event
变量具有函数作用域。您所能做的最好的事情就是用新值重新分配
事件,或者使用另一个变量名。

这不是真的。在JavaScript中,没有块作用域,只有函数作用域。函数中引入的所有变量都被提升到函数的顶部

所以这个代码:

function prepForDrag(obj, event) {
    if (event = "undefined") {
        var event = obj || window.event;
    }
    // ...
}
得到如下解释:

function prepForDrag(obj, event) {
    if (event = "undefined") {
        event = obj || window.event;
    }
    // ...
}
正如所指出的,在这种情况下,声明变量
event
是不必要的,因为
event
已经是一个局部变量,因为它是一个函数参数。欲知更多详情,请阅读本·切里的文章

然而,代码中还有两个额外的问题

  • 在这种情况下,您使用了
    =
    赋值运算符而不是
    =
    比较运算符。因此,条件的计算结果始终为true

  • 如果要检查是否给出了函数参数,请使用
    typeof event==“undefined”
    语句

  • 恐怕还有一个问题。条件的目的是什么?参数
    obj
    是否与
    事件
    有关?现代浏览器将事件对象作为参数传递给事件处理程序函数。为避免该问题,通常使用以下模式:

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

    *注意:JavaScript 1.7中引入了一个在函数内部提供块作用域的函数。当前。

    由于
    事件
    已经是
    prepForDrag
    的一个参数,它的作用域是函数的局部

    但是如果您的
    条件不正确:

    if(event= "undefined")
    
    这将
    “未定义”
    分配给
    事件
    ,并计算为
    。你可能应该使用

    if (typeof event == "undefined")
    
    或者(我认为你想要的是)


    顺便说一句,你为什么要
    eval
    ing
    document.${formName}

    这篇文章很有意思:这仍然不完全正确:因为
    event
    已经是
    prepForDrag
    的一个参数,它已经有了局部范围,不需要使用
    var
    声明变量。上一个规范化事件接口的示例不正确:事件接口作为第一个参数传递给事件处理程序,因此在这种情况下,
    obj
    将保存事件接口,
    e
    从不保存。@Marcel Korpel:你完全正确。谢谢你指出这些问题。@Korpel:这是非常古老的(5年)代码。除非遇到问题,否则从未接触过/改造过。这是一个兼容性问题。因此,评估基本上是读取表单数据,这当然是糟糕的记录:-(
    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
        }
    }