2016-07-07 2 views
1

В чем разница между этим:В чем разница между этой самообслуживающей анонимной функцией и этим обычным вызовом функции?

(function() { 
    var Person = { 
     sayHello: function() { 
      alert('Hello World'); 
     } 
    } 

    Person.sayHello(); 
})(); 

И это:

var Person = { 
    sayHello: function() { 
     alert('Hello World'); 
    } 
} 

Person.sayHello(); 

Кроме последнего создание общественной функции и бывшей быть способом создания своего рода частной функции (вы не можете ссылаться на Person за пределами круглых скобок ... В чем разница?

+0

Первый выполняет его, а второй - нет. –

ответ

8

Первый не оставляет переменную с именем Person, плавающей вокруг текущей области действия (потому что на ней нет ссылок на нее e IIFE завершает выполнение), а также не перезаписывает другие переменные, называемые Person в этой области.

(Второй отсутствует }, но я предполагаю, что это опечатка в вопросе).

2

Первый имеет переменную Person. После выполнения он отбрасывает все, что находится внутри функции SE.

2

1-ый вариант создает «изолированные пространства имен», так что если у вас есть переменная Person где-то в вашем коде, то он не будет перезаписана

2-й вариант создает Человек в глобальном масштабе, так и в может привести к конфликтует с другой частью вашего кода

more info

1

Первыми является прямоприменяемыми Anonymous Функцией, что означает, что ничего определенно в не доступно за его пределы, и, когда он выполняет, everyth внутри «потеряно».

Чтобы иметь возможность вызвать метод SayHello() за пределами этой функции вы должны выставить объект Person к глобальному «окно» объекта:

//Assign 'Person' to the global variable 'Person' 
window.Person = Person; 

Вторая переменная, содержащая объект, и поскольку эта переменная объявлена ​​в глобальной области, она доступна извне, и могут быть созданы новые методы и свойства, а также экземпляры объекта.

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