Это не правда. В 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 .
Тем не менее, в вашем коде есть две дополнительные проблемы.
В условии вы использовали оператор присваивания =
вместо оператора сравнения ==
. Таким образом, условие всегда оценивается как истинное.
Если вы хотите проверить, был ли задан аргумент функции, используйте оператор typeof event == 'undefined'
.
И я боюсь, что здесь есть еще одна проблема. Какова цель состояния? Аргумент obj
имеет какое-либо отношение к event
? Современные браузеры передают объект события в функцию-обработчик в качестве аргумента, но некоторые не . Чтобы избежать проблемы, обычно используется следующий шаблон:
function prepForDrag(e) {
var event = e || window.event;
// ...
}
* Примечание: в JavaScript 1.7 введен оператор let
, который обеспечивает область действия блока внутри функций. В настоящее время поддерживается только в Firefox .