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
- 3389 reads