За последние 24 часа нас посетили 17611 программистов и 1722 робота. Сейчас ищут 898 программистов ...

Запрет определения функции

Тема в разделе "JavaScript и AJAX", создана пользователем ??? Соловьев Е ш326, 23 авг 2014.

  1. Доброго времени суток, дорогие форумчане.

    Ситуация такая:
    В header'е я подключаю свою JS библиотеку с некоторыми функциями.
    Все прекрасно работает и все дела, но сегодня одна из моих функций начала переопределяться из чужого кода.
    Выяснил, что одно из расширений хрома использует функцию с точно таким же именем, поэтому моя функция переопределяется и определенный функционал сайта пропадает.
    Изменить имя функции? но ведь подобные расширения могут встречаться и в дальнейшим у других юзеров.
    Возможно ли в JS коде при определении моей функции дать запрет на ее переопределение?
    Если нет, то с такими ситуациями можно бороться только путем добавления префикса к функции (например my_site_functuion) или есть более адекватный способ?

    С уважением Евгений.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Код (Text):
    1. // левая функция
    2. function getNum(n){
    3.     alert( 'Результат левой функции: ' + (n + 15 )); // 20
    4. }
    5. // Ваши функции
    6. (function(){
    7.    
    8.     function getNum(n){
    9.         alert('Результат вашей функции: ' + n * 10); // 50
    10.     }
    11.     getNum(5); // вызываем свою
    12.    
    13. })();
    14.  
    15. getNum(5); // вызываем левую
     
  3. Дело в том, что левые функции от расширений инициализируются после загрузки моих скриптов.
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Протелепатируем-с. У вас прямо в html, у какого-то элемента, прописано что-то вроде onclick="foo()" и вызывается уже функция "foo" не ваша, а из расширения Chrome. Угадал?
     
  5. Нет.
    У меня так:
    header.php
    Код (Text):
    1. <!DOCTYPE html>
    2. <html>
    3.     <head>
    4.         <!-- код -->
    5.         <script src="<?=$base_url?>js/my_script.js"></script>
    6.         <!-- код -->
    7.     </head>
    8.     <body>
    9.     <!-- код -->
    10.     <!-- еще код -->
    11.     <!-- много кода -->
    12.     <script>my_function('ololo');</script>
    13.     <!-- еще немного кода -->
    my_script.js
    Код (Text):
    1. function my_function(ololo){
    2.     return 'Возможно эта функция будет переопределена  левыми расширениями браузеров';
    3. }
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Для меня останется загадкой, почему нужно раскидывать код по углам страницы. Хотя, если это какой-то экстраординарный случай, на который у меня даже не хватает воображения, то... В общем, выбора у вас не так много: или те же префиксы, о которых вы говорили, или создать объект с набором функций:
    Код (Text):
    1. // Ваши функции
    2. var myFunk = {
    3.     getNum: function(n){
    4.         this.out.insertAdjacentHTML('beforeend','<p>Результат: '  + (n * 10) + '</p>');
    5.     },
    6.     getStr: function(s){
    7.         this.out.insertAdjacentHTML('beforeend','<p>Hello, ' + s + '</p>');
    8.     },
    9.     out: document.querySelector('#output')
    10. };
    11.  
    12. // левые функция
    13. function getNum(n){
    14.     alert( 'Результат левой функции: ' + (n + 15 ));
    15. }
    16. function getStr(s){
    17.     alert('Goodbye, ' + s);
    18. }
    19. // Вызываем ваши функции
    20. myFunk.getNum(5);
    21. myFunk.getStr('world');
     
  7. Способ с объектом красивее, но все равно придется переписывать много кода =(

    А что Вы имели ввиду под "раскидывать код по углам"?
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    У вас есть подключенная библиотека. Так по какой причине, функция вызывается после "много кода"? Есть же наверно какое-то событие, по которому надо её вызвать и это можно сделать из той же библиотеки, внутри замыкания.
     
  9. Аа.. Вы про это. Так и есть. Вызов функции в большинстве случаев происходит из самой же библиотеки. Тут я для наглядности вызвал ее из html
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Вот и задумайтесь над тем, как избежать таких ситуаций в реале. Не используйте onclick и иже с ним внутри html-элементов, а устанавливайте обработчики событий адекватно - addEventListener, создайте область видимости для своей библиотеки и тогда проблем не возникнет, да и переписывать ничего не придётся.