Какова цель этих двух разных объявлений javascript? - PullRequest
3 голосов
/ 12 мая 2010

Я думаю, что я понял это, но надеюсь прояснить, объяснил ли это - в чем именно разница между этими двумя фрагментами javascript?

;Person1 = (function() {
  var FirstName = 'Hello';
  var LastName = 'World';
  this.sayHello = function() {
    alert(FirstName + ' ' + LastName);
  };
});

;Person2 = (function() {
  var FirstName = 'Hello';
  var LastName = 'World';
  this.sayHello = function() {
    alert(FirstName + ' ' + LastName);
  };
})();

Один выполняется с (); в конце другой нет. Они оба работают, как и ожидалось, когда я делаю новый Person1 (). SayHello () или новый Person2 (). SayHello (); - это то, что они оставляют позади? Из того, что я понимаю, последнее является закрытием, которое выполняется, КАК ЭТО ПРОЧИТАНО браузером, но я еще не полностью осознал последствия этого. Спасибо за вашу помощь!

ОБНОВЛЕНИЕ: я ошибочно пропустил ключевое слово return в закрытии Person2. Я не исправил это, однако, потому что ответы были очень полезны в описании последствий этого:)

Ответы [ 3 ]

0 голосов
/ 12 мая 2010

первый определяет встроенную функцию, а Person1 содержит ссылку на нее.

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

ни один из примеров не ведет себя так, как вы описали, поэтому, возможно, вы допустили ошибку при наборе вашего примера?

0 голосов
/ 12 мая 2010

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

0 голосов
/ 12 мая 2010

Person1 - это довольно стандартный тип функции конструктора объекта, предназначенный для вызова с new. new Person1() создает новый объект и создает метод sayHello для этого объекта.

Person2 выполняется немедленно, что вызывает некоторые проблемы! При оценке Person2 функция вызывается (в глобальном контексте). Внутри выполнения этой функции this будет объектом window. Выполненная функция ничего не возвращает, поэтому Person2 оказывается неопределенным:

>>> Person2 = (function() { var FirstName = 'Hello' // ...}; })(); 
>>> console.log(window.sayHello, Person2);
function() undefined

A new Person2() приводит к TypeError "Person2 не конструктор" для меня. Если вы немного измените это, вы можете заставить замыкание Person2 возвращать объект с вашей функцией:

;Person2 = (function() {
  var FirstName = 'Hello';
  var LastName = 'World';
  return {
    sayHello: function() {
      alert(FirstName + ' ' + LastName);
    }
  };
})();

Person2.sayHello();

Или сделать так, чтобы она возвращала функцию (чтобы вы могли new Person2()):

;Person2 = (function() {
  var FirstName = 'Hello';
  var LastName = 'World';
  return function() {
    this.sayHello = function() {
      alert(FirstName + ' ' + LastName);
    };
  };
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...