2013-06-12 3 views
21

Во многих местах я вижу сценарии, как это:Зачем использовать функцию самоисполнения?

(function() { 
    var hello = 'Hello World'; 
    alert(hello); 
})(); 

Почему бы просто не написать это так, без какой-либо функции:

var hello = 'Hello World'; 
alert(hello); 
+1

Keeping глобальное пространство имен является чистой одна определенная причина - тем самым снижая вероятность конфликта. – techfoobar

ответ

26

Мы используем себя функцию выполнения для управления Области видимости переменной.

Объем переменной - это область вашей программы, в которой она определена. Глобальная переменная имеет глобальный охват; он определяется везде в вашем JavaScript-коде. (Даже в ваших функциях). С другой стороны, переменные, объявленные внутри функции, определяются только внутри тела функции. Они являются локальными переменными и имеют локальную область действия. Параметры функции также считаются локальными переменными и определяются только внутри тела функции.

var scope = "global"; 
function checkscope() { 
    alert(scope); 
} 

checkscope(); // global 

Как вы видите, вы можете получить доступ к переменной scope внутри вашей функции, но, в теле функции, локальная переменная имеет приоритет над глобальной переменной с тем же именем. Если вы объявляете локальную переменную или параметр функции с тем же именем, что и глобальная переменная, вы фактически скрываете глобальную переменную.

var scope = "global"; 
function checkscope() { 
    var scope = "local"; 
    alert(scope); 
} 

checkscope(); // local 
alert(scope); // global 

Как вы видите, переменная внутри функции не будет перезаписывать глобальные переменные. Из-за этой функции мы помещаем код внутри собственной функции, , чтобы предотвратить перезапись других переменных, , когда наш код становится большим и большим.

// thousand line of codes 
// written a year ago 

// now you want to add some peice of code 
// and you don't know what you have done in the past 
// just put the new code in the self executing function 
// and don't worry about your variable names 

(function() { 
    var i = 'I'; 
    var can = 'CAN'; 
    var define = 'DEFINE'; 
    var variables = 'VARIABLES'; 
    var without = 'WITHOUT'; 
    var worries = 'WORRIES'; 

    var statement = [i, can, define, variables, without, worries]; 

    alert(statement.join(' ')); 
    // I CAN DEFINE VARIABLES WITHOUT WORRIES 
}()); 
12

IIFE (сразу вызывается выражение функции) избегает создания глобальной переменной hello.

Есть и другие виды использования, но для примера кода, который вы опубликовали, это было бы причиной.

+0

Чтобы расширить это. IIFE также отлично подходит для создания пользовательских пространств имен, которые будут «расширением» упомянутой функции. –

5

Помимо поддержания глобального пространства имен в чистоте, они также полезны для создания частных методов доступных функций в то же время подвергая некоторые свойства для последующего использования -

var counter = (function(){ 
    var i = 0; 

    return { 
    get: function(){ 
     return i; 
    }, 
    set: function(val){ 
     i = val; 
    }, 
    increment: function() { 
     return ++i; 
    } 
    }; 
}()); 

// 'counter' is an object with properties, which in this case happen to be 
// methods. 

counter.get(); // 0 
counter.set(3); 
counter.increment(); // 4 
counter.increment(); // 5 
2

Может быть несколько причин.

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

Еще один может быть связывания переменных, например

for (var i = 0; i < n; i++) { 
    element.onclick = (function(i){ 
     return function(){ 
     // do something with i 
    } 
    })(i); 
} 
+0

Можно ли инкапсулировать запуск всего веб-приложения, используя это?Если это так, это было бы отличным средством описания глобального пространства имен. Но вопрос, который у меня есть на данный момент, заключается в том, как сделать желаемые сущности * постоянными * используя это? Придется ли мне прибегнуть к закрытию для этого? –

Смежные вопросы