Это связано с тем, что поднял объявления переменных .
По сути, JavaScript разделяет объявление переменной на две , оставляя присвоение, в котором вы сделали объявление, и поднимая фактическое объявление до верхней части функции :
var f1 = function () {
// some code
var counter = 0;
// some more code
}
var f2 = function () {
var counter; // initialized with undefined
// some code
counter = 0;
// some more code
}
Во время выполнения f1()
переводится в f2()
. Я написал подробное сообщение в блоге об этом здесь . Я надеюсь, что это поможет вам понять, что происходит в вашем коде.
Это также причина, поэтому рекомендуется объявлять переменные в начале функции в JavaScript. Это поможет вам понять, что делает код, когда он выполняется.