Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Хотелось бы понять функцию


Автор: YahоО 9.3.2019, 11:41
Хотелось бы понять одну функцию, т.е почему она именно так написана, а конкретнее: зачем в круглых скобках, что идут сразу за фигурной скобкой,
написан 0, запятая и что то там еще, 
зачем нужны эти элементы в круглых скобках в этой функции:

Код

 var k = function(a, b, c, e) {
            (0,
            d.LoadCSSFile)(a, function(a, f) {
                if (console.log("CSS file load complete: " + a),
                g || (f = f.replace(/\.\.\//gi, window.veamsConfig.themeUrl)),
                e(a, f),
                (0,
                d.StorageAvailable)("localStorage"))
                    try {
                        (0,
                        d.LocalStorageSet)(c, window.veamsConfig.cssJsQueryString),
                        (0,
                        d.LocalStorageSet)(b, f),
                        console.log("Saved " + c + " to local storage")
                    } catch (h) {
                        console.error(h)
                    }
            })
        };

Такая конструкция встречается неоднократно на сайте https://www.iqos.com.ua/themes/custom/pmi3/scripts/head-script.js?v=8.5.11
Как эта функция работает, и что вообще выполняет эта функция в целом?

Автор: ksnk 10.3.2019, 18:18
Это - результат минимизации - способа, с помощью которого код делают меньше. Используется специфический JS трюк для оператора в круглых скобках - все операторы, перечисленные через запятую, выполняются последовательно, значение самого оператора - самое последнее значение.

Некоторые конструкции вызывают недоумение - 
Код

(0,d.LocalStorageSet)(...

Вероятно тут какая-то ошибка логики минимизатора, так как конструкцию можно было записать и короче 
Код

d.LocalStorageSet(...

Автор: whatisnot 11.3.2019, 00:24
Цитата(ksnk @  10.3.2019,  18:18 Найти цитируемый пост)
Вероятно тут какая-то ошибка логики минимизатора


Это не ошибка, а "защита от дураков".

Автор: YahоО 11.3.2019, 21:28
Защита от дураков по всей видимости это вся функция. Вероятно она вообще никогда не вызывается и не выполняется.
Потому что вся функция не рабочая, при попытке ее выполнить все стопорится.
Разве что в процессе работы скрипта эта функция подвергается какой либо модификации:
Код

function t(a){document.body.innerHTML+=a+'<br>'}

var k = function(a, b, c, e) {
                     t(1);
    (0, d.LoadCSSFile)(
      a, 
      function(a, f) {
                     t(2);
        if(console.log("CSS file load complete: " + a),
            g || (f = f.replace(/\.\.\//gi, window.veamsConfig.themeUrl)),
            e(a, f),
            (0, d.StorageAvailable)("localStorage")
           )
                     t(3);
            try {  t(4);
                (0, d.LocalStorageSet)(c, window.veamsConfig.cssJsQueryString),
                (0, d.LocalStorageSet)(b, f),
                console.log("Saved " + c + " to local storage")
            } catch (h) {
                     t(5);
                console.error(h)
            }
      }
    )
};
t("Start");
//k();
//k(1,2,3,4);
k=k.toString().split("{")[0]+/*"..."+*/  "{t(77)}";
t(k);
eval("k="+k);
k();
t("Finish");

Интересно зачем понадобились такие выкрутасы на том сайте, но это уже не вопрос, потому дальше рассматривать их скрипты уже не интересно, после таких "функций".
ksnk, whatisnot спасибо!

Автор: ksnk 13.3.2019, 13:50
Вообще-то функция работающая. Если просто выковырять ее из окружающего текста по ссылке выше, то там будут неопределенные переменные (d) и неопределенные функции.
а так - какая то js библиотека...

С чего вообще возникла идея ковырять чужой код? Для обучения есть более открытые источники smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)