Есть ли способ «недооценить» функцию в Javascript?

#javascript #jquery

#javascript #jquery

Вопрос:

Я поверхностно понимаю, как переопределяются функции в javascript … выполняется последний загруженный метод (с тем же именем — без подписей).

Надстройка моей веб-страницы распространяется в виде js-скрипта. Как часть его функциональности, сторонний скрипт вызывает метод ‘x ()’ при его загрузке. Пользователи моего дополнения могут уже иметь метод x() на своей веб-странице для взаимодействия (по-своему) с этим сторонним скриптом. Если они этого не делают, я хочу выполнить свою. Проблема в том, что мой x() переопределяет их, а это не то поведение, которое требуется.

Лично я думаю, что это немного безумно, с задержкой в Интернете, переопределять функции с помощью «последних правил». Думаю, это уже другая история.

К счастью, я могу искать конкретный div и знаю, что у клиента будет свой собственный метод x(), и он условно добавил мой метод в качестве отдельного скрипта. Таким образом, мой метод присутствует на странице только в том случае, если их нет.

Есть ли более элегантный способ сделать это? По сути, я хотел бы x(), который недооценит x() клиента. Я обеспокоен тем, что в какой-то момент я не смогу легко проверить их x() . Кстати … проверка наличия x() с помощью typeof === 'function' просто возвращает true для моего x() .

Комментарии:

1.Проверьте наличие существующей, x прежде чем создавать свою.

2. @Pointy собирался предложить то же самое 🙂

3. поскольку ваш код является надстройкой, он должен иметь свою собственную область видимости, чтобы избежать конфликтов с сосуществующими переменными JS и, в целом, предотвратить загрязнение глобальной области видимости. Для достижения этой цели используйте область видимости, например, IIFE

4. @Pointy будет, но должен быть глобальным. Объявляется перед самозваным методом.

5. @Benediktas это было бы неплохо, но я посмотрел на это и не вижу никакого способа использовать стороннюю библиотеку и клиентские скрипты. Отчасти для того, чтобы мой интерфейс «api» был простым. Не хочу, чтобы пользователь передавал мне свои функции. Это становится действительно неаккуратным.

Ответ №1:

Глобальное загрязнение пространства имен — ужасная вещь. Это разрушает семьи и разрушает наши города. Однако в этом случае вы можете смягчить проблему:

 let existingX = window.x || undefined;
function x(whatever) {
  if (existingX amp;amp; typeof existingX == 'function') {
    existingX(whatever);
  }
  else {
    // all of your version of x
  }
}
  

Если хотите, вы можете использовать более неясное имя, чем «existingX», чтобы избежать еще одного столкновения.

Другим вариантом может быть:

 var x = window.x amp;amp; typeof window.x == 'function' ? window.x : function(whatever) {
  // your code
};
  

Конечно, если существующая x функция — это нечто иное, чем функция, которая намеревается переопределить вашу, вы мало что можете сделать, кроме, может console.log() быть, строгого предупреждения.

Комментарии:

1. Так что используйте это глобально?

2. @StephanLuis да, потому что (как я понял ваше объяснение) страницы, использующие ваш сервис, должны x быть глобальной функцией. (В любом случае, это, вероятно, единственный практический выбор.)