Каков результат в javascript с несколькими библиотеками, использующими $

#javascript #dollar-sign

#javascript #знак доллара

Вопрос:

Давайте представим, что это находится в <head> вашей HTML-странице.

УПС, этого немного не хватало раньше …:

 <script type="text/javascript" src="/include/js/billys.js"></script>
<script type="text/javascript" src="/include/js/susies.js"></script>
<script type="text/javascript" src="/include/js/marys.js"></script>
  

Порядок трех скриптов может отличаться. Каким был бы результат?

Билли определяет $ как

 function $ () {
 return false;
}
  

Сьюзи определяет $ как

 function $ () {
 return document.getElementById('body');
}
  

Мэри определяет $ как

 function $ () {
 alert('I wrote this');
}
  

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

1. Извините, смотрите вопрос сейчас. Я говорю с внешними файлами js. Просто для ясности.

2. как я уже сказал в своем ответе. что бы ни было последним, это определение $

Ответ №1:

Все, что является последним, является окончательным определением $

Вот почему в (например) jQuery есть, noConflict() который позволяет использовать переменную, отличную $ от jQuery

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

1. Таким образом, это ВСЕГДА [ВСЕГДА] сверху вниз, и все, что является последним, это то, что он будет использовать?

2. Я подтверждаю, что вы говорите, что порядок скриптов действительно имеет значение.

3. нет, если у вас нет setTimeout(function(){window.$=undefined;},100); or window.onload , определяющего функцию: P

Ответ №2:

Почему бы не попробовать это?

 function $ () {
 return false;
}
function $ () {
 return document.getElementById('body');
}
function $ () {
 alert('I wrote this');
}
$(); // alerts "I wrote this"
  

Более позднее определение перезаписывает существующее. Вот почему обычно рекомендуется проверять, существует ли функция перед ее определением. например

 if (typeof $ !== 'function') {
    function $(){ /* your code */}
}
  

или сбой каким-либо разумным способом.

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

1. Если функция существует, перезапишите ее пустой функцией? Я думаю, вам нужно немного изменить ваш последний пример.

2. @minitech Хм, да, !== это то, что я имел в виду. Комментарий добавлен для ясности.

3. @Joel Хороший материал — добавлен к ответу.

4. Я не использовал Jsfiddle, поскольку мой вопрос был связан с несколькими внешними файлами js. Сначала я случайно опубликовал вопрос, в котором этот бит отсутствовал..

5. @Doug Ну, это все одно и то же. Несколько тегов скрипта анализируются последовательно, независимо от того, являются ли они встроенными или внешними, и они фактически являются одним файлом.

Ответ №3:

Выигрывает последняя функция с тем же именем.