Каков объем этого объекта - PullRequest
3 голосов
/ 13 сентября 2010

У меня есть следующий фрагмент кода, который использует 'событие' Мои коллеги-разработчики утверждают, что область действия '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 ]

10 голосов
/ 13 сентября 2010

Это не правда. В 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 уже является локальной переменной, поскольку это параметр функции. Подробнее об этом читайте в статье Бена Черри о JavaScript Scoping and Hoisting .

Тем не менее, в вашем коде есть две дополнительные проблемы.

  1. В условии вы использовали оператор присваивания = вместо оператора сравнения ==. Таким образом, условие всегда оценивается как истинное.

  2. Если вы хотите проверить, был ли задан аргумент функции, используйте оператор typeof event == 'undefined'.

И я боюсь, что здесь есть еще одна проблема. Какова цель состояния? Аргумент obj имеет какое-либо отношение к event? Современные браузеры передают объект события в функцию-обработчик в качестве аргумента, но некоторые не . Чтобы избежать проблемы, обычно используется следующий шаблон:

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

* Примечание: в JavaScript 1.7 введен оператор let , который обеспечивает область действия блока внутри функций. В настоящее время поддерживается только в Firefox .

6 голосов
/ 13 сентября 2010

Поскольку 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 ing document.${formName}?

2 голосов
/ 13 сентября 2010

JavaScript не имеет области видимости блока (за исключением переменной исключения внутри блока catch), поэтому в вашем случае переменная event имеет область действия функции. Лучшее, что вы можете сделать, это переназначить event с новым значением или, возможно, использовать другое имя переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...