Ошибка / Предупреждение в Javascript: функция внутри цикла

Я новичок в JavaScript, и я изучаю его из онлайн-учебника. Текущее выражение касается использования функциональных выражений, а именно - возврата функционального выражения внутри функции.

Вот код:

//array of all available rides, with respective wait times
var parkRides = [["Birch Bumpers", 40], ["Pines Plunge", 55], ["Cedar Coaster", 20], ["Ferris Wheel of Firs", 90]];

//array of fast pass rides, indicating next up ride
var fastPassQueue = ["Cedar Coaster", "Pines Plunge", "Birch Bumpers", "Pines Plunge"];

//function to build fast pass queue using array
function buildTicket(allRides, passRides, pick) {

    //if user has picked the first ride in fast pass queue, alert so...
    if(pick == passRides[0]) {

        //remove first item from queue using shift and store it in a var
        var pass = passRides.shift();

        //return function expression here
        return function () {
            alert("QuicK!! You've got a fast pass to " + pass + "!");
        };  //return ends with a ;

    }

    else {
        for (var i = 0; i < allRides.length; i++) {
            if(pick == allRides[i][0]) {

                //return a function expression here
                return function () {
                    alert("A ticket is printing for " + allRides[i][0] +"!\n"+ " Your wait time is about " + allRides[i][1] + " minutes.");
                };
            }

        }
    }

}

//use function buildticket
var wantsRide = "Pines Plunge";

var ticket = buildTicket(parkRides, fastPassQueue, wantsRide);

//execute function expression by calling ticket()
ticket();

Я использую код MS Visual Studio, и в конце кода я получаю одну ошибку и одно предупреждение, несмотря на то, что код успешно работает, и я получаю желаемый результат в зависимости от wantsRide переменная. Однако я не смог понять причину ошибки и предупреждения.

В нижней части экрана (скриншот ниже) я получаю 1 крестик и 1 восклицательный значок, я предполагаю, что это означает 1 ошибку и 1 предупреждение.

Но когда я нажимаю на нее, я получаю выделенную область в верхней части панели, которая говорит ! Function inside loop и эти строки выделены:

return function () {
                    alert("A ticket is printing for " + allRides[i][0] +"!\n"+ " Your wait time is about " + allRides[i][3] + " minutes.");
                };

В чем здесь проблема? Я знаю, что это выражение функции внутри for цикл, но почему генерируется предупреждение? Это потому что if(pick==allRides[i][0]) оператор никогда не может быть истинным, поэтому выражение функции никогда не будет выполнено?

1 ответ

Это что-то вроде удара в темноте, но может случиться так, что MSVS не понимает, что именно возвращает ваша функция (т.е. другая функция).

Этот вопрос может пролить свет на проблему:

Создать функцию JavaScript, которая работает с IntelliSense

(или я могу лаять совсем не на том дереве)

Так что это может работать лучше в MSVS, если вы определяете возвращаемое значение как переменную типа "функция" и переопределяете ее позже, когда это необходимо. Что-то вроде:

//function to build fast pass queue using array
function buildTicket(allRides, passRides, pick) {

    var func = new function() {}

    //if user has picked the first ride in fast pass queue, alert so...
    if(pick == passRides[0]) {

        //remove first item from queue using shift and store it in a var
        var pass = passRides.shift();

        func = function () {
            alert("QuicK!! You've got a fast pass to " + pass + "!");
        };  //return ends with a ;
        //return function expression here
        return func;

    }

    else {
        for (var i = 0; i < allRides.length; i++) {
            if(pick == allRides[i][0]) {

                func = function () {
                    alert("A ticket is printing for " + allRides[i][0] +"!\n"+ " Your wait time is about " + allRides[i][1] + " minutes.");
                };
                //return a function expression here
                return func;
            }

        }
    }

}

хотя это не объясняет, почему MSVS жалуется на 2-й ответный звонок, а не на 1-й (или оба), поэтому я могу быть совершенно неправ (у меня нет или не используется MSVS).

Другие вопросы по тегам