2015-08-18 1 views
0

Изучая javascript, и я хотел получить обратную связь о функциях самозапуска.Я вызываю функции javascript для очистки переменных в глобальном пространстве имен

Я читал, что создание глобальных переменных - это не путь.

Это оригинальный

// Footer of page 
<script> 
    var lat = 51.505 // retrieved from db 
    var lon = -0.09 // retrieved from db 

    var map = L.map('map').setView([51.505, -0.09], 13); 

    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { 
     attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' 
    }).addTo(map); 

    L.marker([lat, lon]).addTo(map) 
     .bindPopup('You are here.') 
     .openPopup(); 
</script> 

Refactored

// Footer of page 
<script> 
    (function(){ 
     var createMap = function() { 
      var lat = 51.505 // retrieved from db 
      var lon = -0.09 // retrieved from db 

      var map = L.map('map').setView([lat, lon], 13); 

      L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { 
       attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' 
      }).addTo(map); 

      L.marker([lat, lon]).addTo(map) 
       .bindPopup('You are here.') 
       .openPopup(); 
     }(); // createMap function self invocation 
    })(); // anonymous function self invocation 
</script> 

Я уверен, если моя переработана версия имеет смысл, так как я создаю функцию var createMap внутри собственный вызов анонимной функции ,

Я не хочу облаковать глобальное пространство имен моими lat & lon переменными, которые извлекаются из базы данных.

UPDATE

Или следующий больше смысла. Самовозбуждение анонимной функции с переменными и кодом внутри. Это не будет мешать или добавлять назначенные переменные в глобальное пространство имен?

// Footer of page 
<script> 
    (function(){ 
     var lat = 51.505 // retrieved from db 
     var lon = -0.09 // retrieved from db 

     var map = L.map('map').setView([lat, lon], 13); 

     L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { 
      attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' 
     }).addTo(map); 

     L.marker([lat, lon]).addTo(map) 
      .bindPopup('You are here.') 
      .openPopup(); 
    })(); // anonymous function self invocation 
</script> 
+0

Я не вижу 'var buildMap' где угодно. Вы имеете в виду 'createMap()'? – slebetman

+0

В настоящее время нет смысла в гнезде другого IIFE. Почему, по-вашему, вам нужна 'createMap'? – Sirko

+0

BTW 'createMap' в настоящее время' undefined', поскольку он не относится к функции, а к возврату этой функции. – Hacketo

ответ

1

потерять функцию createMap, нет никакой необходимости в этом, так как вы уже используете внешнюю IIFE (Сразу-Срабатывает функция Expression). Таким образом, вы не загрязняете глобальное пространство имен:

(function() { 
    var lat = 51.505 // retrieved from db 
    var lon = -0.09 // retrieved from db 

    var map = L.map('map').setView([lat, lon], 13); 

    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { 
     attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' 
    }).addTo(map); 

    L.marker([lat, lon]).addTo(map) 
     .bindPopup('You are here.') 
     .openPopup(); 
})(); // anonymous function self invocation 
+0

спасибо за разъяснение. –