Почему некоторые js файлы начинаются с (function() {

Просто, почему некоторые js файлы (такие как Ember или JQuery.js) начинаются с (function() {...})();?

Ответ 1

Код формы (function() { /* code here */ })() известен как выражение "Вызываемое мгновенное выражение". Он часто используется для настройки закрытия, поэтому вы можете определять переменные без загрязнения глобальной области. По этой причине вы находите его в Ember, jQuery и почти любом другом "подключаемом модуле". Загрязнение глобальной области обычно плохое, но с плагинами, которые должны работать на всех сайтах, особенно важно убедиться, что он не случайно перезаписывает переменную, которую использует создатель сайта.

Конечно, есть и другие виды использования. Например, его можно использовать для "привязки" итерирующей переменной, например:

for( i=0; i<links.length; i++) {
    (function(i) {
        links[i].onclick = function() {alert(i);};
    })(i);
}
// without the IIFE, all links would alert the value of links.length instead.

Есть также некоторые случаи, когда я иногда использую IIFE, которые, вероятно, будут зависеть от большинства людей, таких как вычисление "точно в срок":

if( (function() {
      var party=document.getElementById('party').children, l=party.length, i, r=0;
      for( i=0; i<l; i++) if( party[i].children.length > 0) r++;
      return r;
  })() == 6) {
    // your Party is full
}

Выше было бы намного лучше, если бы оно было рассчитано до перехода в оператор if, поэтому... не делайте так, как я делаю на этом!

Ответ 2

Синтаксис, начинающийся с

(function(){
  /* code */ 
}());

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

Подробнее: http://en.wikipedia.org/wiki/Immediately-invoked_function_expression