2015-10-29 6 views
1
<a onclick="testFunction(); return false;">Click me</a> 
<script type="text/script"> 
    (function(){ 
     var testFunction = function(){ 
      console.log('From test function'); 
     }; 
    })(); 
</script> 

В приведенном выше коде, когда я нажимаю на гиперссылку, он показывает testFunction не определен.Как вызвать функцию внутри IIFE

Как выполнить тестовую функцию без загрязнения глобального пространства имен?

+4

Добавить событие в раздел IIFE с помощью 'addEventListener'. – Teemu

+0

* Если вы настаиваете на использовании встроенного обработчика событий, то ваша функция должна жить в модуле, а встроенный обработчик будет ссылаться на функцию через свой модуль. Ответы ниже - лучший выбор, хотя вам нужно подождать, пока DOM загрузится, чтобы прикрепить обработчик. –

ответ

4

Вот почему вы не используете встроенную обработку событий. Определите метод обработчика событий внутри вашего IIFE, в противном случае область не может достигать и testFunction не определена.

<a id="clickMeInstead">Click me</a> 
<script type="text/script"> 
    (function(){ 
     var testFunction = function(){ 
      console.log('From test function'); 
     }; 
     var link = document.getElementById("clickMeInstead"); 
     link.addEventListener("click", function() { 
      //run code here 
     }); 
    })(); 
</script> 
1

Использование addEventListener вместо встроенных событий

var link = document.getElementsByTagName("a")[0]; 
link.addEventListener("click", function() { 
    console.log('From test function'); 
}); 
1

Если вы просто хотите, чтобы предотвратить функции теста() загрязнять глобальное пространство имен, вы можете сделать изменение откровенного шаблона дизайна модуля для достижения этой цели пути делая следующее:

<a onclick="coverModule(); return false;">Click me</a> 

<script> 
     function coverModule() { 
      return (function testFunction() { 
        alert('From test function'); 
      })(); 
     } 
</script> 

Я бы рекомендовал это с использованием обработчиков событий, поскольку манипуляция DOM является дорогостоящей операцией. Но учтите, что это не оптимальное решение, поскольку встроенный JavaScript не очень приятный.