javascript Имя переменной как имя функции(/класса) - одинаковые -- когда сработает, а когда нет
Primary tabs
Интересная проблема возникает при совпадении имени переменной и имени класса, например:
start();
function start() {
var Task = new Task();
};
function Task() {
console.log('work!');
}
// ОШИБКА: TypeError: TaskPackage is not a constructor
Чтобы исправить, можно написать так (хотя бы изменим букву в переменной):
start();
function start() {
var task = new Task();
};
function Task() {
console.log('work!');
}
// выполнится успешно
НО: если написать вот так:
var Task = new Task();
function Task() {
console.log('work!');
}То ошибки не будет!
Почему это происходит
На вопрос ответил deceze.
Дело в том, что здесь как раз наблюдается эффект подъёма и данный код работает следующим образом.
Последний фрагмент по сути работает так:
var Task; // (undefined)
Task = function () {
console.log('work!');
};
Task = new Task(); // по сути присваивание переменной-функкции самой себе! (всё нормально)
А первый так:
var start, Task;
start = function () {
var Task; // (undefined) -- перекрываем глобальную локальной для этой функции
Task = new Task(); // переменная вообще не инициаллизирована! (ошибка)
};
Task = function () {
console.log('work!');
};
start();
- Log in to post comments
- 4111 reads