Подтвердить что ты не робот

Зачем использовать функцию самоисполнения?

Во многих местах я вижу такие сценарии:

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

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

var hello = 'Hello World';
alert(hello);
4b9b3361

Ответ 1

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

Область действия переменной - это область вашей программы, в которой она определена. Глобальная переменная имеет глобальный масштаб; он определяется везде в вашем 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
}());

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

Другим может быть связывающие переменные, например

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