代码之家  ›  专栏  ›  技术社区  ›  GustyWind

这个对象的范围是什么

  •  3
  • GustyWind  · 技术社区  · 14 年前

    我的开发人员同事认为,“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
        }
      }
    
    3 回复  |  直到 14 年前
        1
  •  10
  •   Community CDub    7 年前

    那不是真的。在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 在这种情况下是不必要的,因为 已经是局部变量,因为它是函数参数。欲知更多详情,请阅读本·切瑞的文章 JavaScript Scoping and Hoisting .

    1. 在你使用 = == 比较运算符。所以条件的计算结果总是真的。

    2. 如果要检查是否给定了函数参数,请使用 typeof event == 'undefined' 声明。

    obj 有什么关系吗 事件 ? 现代浏览器将事件对象作为参数传递给事件处理函数,但是 some do not . 为了避免问题,通常使用以下模式:

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

    * 注意:有一个 let statement 在JavaScript 1.7中引入,在函数中提供块作用域。目前 it's only supported in Firefox .

        2
  •  6
  •   Marcel Korpel    14 年前

    作为 event prepForDrag ,其范围是 .

    但是你的 if 条件错误:

    if(event= "undefined")
    

    此分配 "undefined" 并评估为 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} ?

        3
  •  2
  •   Ionuț G. Stan    14 年前

    catch event 变量具有函数作用域。你所能做的就是重新分配 事件