这个对象的范围是什么

Gus*_*ind 3 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
    }
  }
Run Code Online (Sandbox Code Playgroud)

Tör*_*bor 10

这不是真的.在JavaScript中没有块范围,只有函数范围*.函数中引入的所有变量都会被提升到函数的顶部.

所以这段代码:

function prepForDrag(obj, event) {
    if (event = "undefined") {
        var event = obj || window.event;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

获得解释有点像这样:

function prepForDrag(obj, event) {
    if (event = "undefined") {
        event = obj || window.event;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

正如Marcel Korpel指出的那样,event在这种情况下声明变量是不必要的,因为event它已经是一个局部变量,因为它是一个函数参数.有关详细信息,请阅读Ben Cherry关于JavaScript范围和提升的文章.

不过,您的代码中还有两个问题.

  1. 在条件中,您使用=赋值运算符而不是==比较运算符.所以条件总是评估为真.

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

而且我担心这里还有一个问题.病情的目的是什么?论证有obj什么关系event吗?现代浏览器将事件对象作为参数传递给事件处理函数,但有些则不然.为避免此问题,倾向于使用以下模式:

function prepForDrag(e) {
    var event = e || window.event;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

*注意:JavaScript 1.7中引入了一个let声明,它在函数内部提供块范围.目前它仅在Firefox中受支持.


Mar*_*pel 6

由于event已经是参数prepForDrag,其范围是函数的本地.

但你的if情况是错的:

if(event= "undefined")
Run Code Online (Sandbox Code Playgroud)

这将分配"undefined"event并评估true.你可能应该使用

if (typeof event == "undefined")
Run Code Online (Sandbox Code Playgroud)

或者(我认为你想要的是)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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