IE выдает ожидаемую ошибку двоеточия, работает в Chrome? Массив объектов с литералом объекта и функцией

#javascript #internet-explorer

#javascript #internet-explorer

Вопрос:

Я пишу функцию, которая извлекает текст из файла и проверяет текст. Он работает плавно в Chrome, но не в IE? Из того, что я могу найти в Интернете, IE должен поддерживать все, с чем я работаю. Когда я запускаю его в IE, он выдает ошибку «Expected ‘:'» в конце каждого test(data)

Текущий код:

     function testText(callback)
    {
        const filePaths =
        [
            {
                url: "http://example.com/example.txt",
                test(data)
                {
                    const compareText = data.localeCompare(trigger, "en", {sensitivity: "base"});

                    if (compareText == 0)
                    {
                        globalNotifEnabled = true;
                        return true;
                    }
                    return false;
                }

            },
            {
                url: "http://www.example.com/UserExceptions.txt",
                test(data)
                {
                    const rawUsers = data;
                    const userExceptions = rawUsers.split(';');

                    if (userExceptions.indexOf(currentUser) > -1)
                    {
                        console.log("User exception is: "   userExceptions[userExceptions.indexOf(currentUser)]);
                        return false;
                    }
                    return true;
                }
            },
            {
                url: "http://www.example.com/test/notification.txt",
                test(data)
                {
                    globalNotification = data;
                    notify(globalNotification);
                    console.log("Global notification displayed.");
                    return true;
                }
            }
        ];

        (function getFiles(currentStage)
        {
            $.get(filePaths[currentStage].url, function(data)
            {
                if (filePaths[currentStage].test(data))
                {
                    if (filePaths.length > currentStage   1) getFiles(currentStage   1)
                        else callback(null, "Success!")
                }
                else callback(Error(`Stage ${currentStage}'s test failed.`, null))  
            }, 'text')
            .fail(function()
            {
                console.log("Global notifications failed at stage: "   currentStage);
            });
        })(0);
    }
  

Есть ли причина, по которой Chrome разрешает мне доступ test(data) , но IE требует, чтобы у меня было что-то вроде blah: function test(data) ? Я попытался изменить объекты так, чтобы они выглядели так:

                 url: "http://example.com/example.txt",
                setTest: function(test(data))
                {
                    const compareText = data.localeCompare(trigger, "en", {sensitivity: "base"});

                    if (compareText == 0)
                    {
                        globalNotifEnabled = true;
                        return true;
                    }
                    return false;
                }
  

… и вызывая его в getFiles функции, например:

 if (filePaths[currentStage].setTest)
...
  

Он не выдает ошибок в IE, но на самом деле он не использует функцию так, как мне нужно в getFiles части.

Ответ №1:

Вы используете синтаксис метода:

 {
    url: "http://example.com/example.txt",
    test(data) // <==== here
    {
        // ...
    }
}
  

Это было добавлено в ES2015. IE11 не поддерживает его (ни одна версия IE не поддерживает), но современные браузеры поддерживают. (Я не думаю, что IE11 поддерживает какой-либо из ES2015 должным образом, поскольку он был выпущен в 2013 году, и Microsoft не добавляет функции в существующие версии IE. Это так let , но семантика неверна в for циклах.)

Как вы обнаружили, ответ заключается в использовании вместо инициализатора свойства:

 {
    url: "http://example.com/example.txt",
    test: function(data)
// -----^^^^^^^^^^
    {
        // ...
    }
}
  

Или, конечно, напишите современный JavaScript и используйте транспилятор, такой как Babel, для преобразования кода в ES5 (возможно, с полизаполнениями) для IE.