Показать сообщение отдельно
  #22 (permalink)  
Старый 31.03.2009, 23:05
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

kefi, нет. Всё-таки, слово "скрипт" получилось несколько путанным в этой формулировке (вот только недавно насчёт этого же вопрос был).

Перефразирую точнее:

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

Всего есть три контекста: глобальный, функция и eval (подробней - в ссылке ниже).

Поэтому, при входе в функцию её Variable object (Объект переменных, пункт 10.1.3) наполняется снова.

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

В первом случае, у Вас FE:

this.action1=function(){ /* код функции */; };


Такая функция, как было сказано, создаётся в рантайме и не воздействует на VO, однако, последующее присвоение её свойству this.action1 оставляет функцию в памяти (иначе FE можно выполнить только сразу при объявлении, т.к. в VO они не попадают и дальше вызвать их нельзя).

Во втором случае, у Вас FD:

function F (){ /* код функции */; }
this.action1=F ;


И, хотя, эта функция будет создана при входе в контекст исполнения (до выполнения кода функции), всё равно, функция будет так же создана новая - для каждого объекта своя.

Сообщение от kefi
Если да, то тогда будет лучше для экономии памяти
А вот для экономии памяти, общие свойства объектов (как правило, это методы), лучше вынести в прототип:

function A(state) {
  this.state = state; // у каждого объекта своё свойство
  this.fn = function () {}; // тоже своё
  function fn2() {}
  this.fn2 = fn; // тоже своё
}

// а вот методы - описаны единожды,
// но так же доступны всем порождённым
// объектам - за счёт делегации к прототипу
A.prototype = {
  constructor: A,
  test: function () {
    alert(this.a);
  }
};

// можно и отдельно описывать методы в прототипе
A.prototype.test2 = function () {
  alert(this.state + ' test2');
};

var a = new A(10);
var b = new A(20);

a.test(); // 10
b.test(); // 20

alert([
  a.hasOwnProperty('state'), // true
  b.hasOwnProperty('state'), // true

  a.hasOwnProperty('fn'), // true
  b.hasOwnProperty('fn'), // true

  a.hasOwnProperty('fn2'), // true
  b.hasOwnProperty('fn2'), // true

  a.hasOwnProperty('test'), // false, нет родного свойства, возьмётся из прототипа
  b.hasOwnProperty('test') // false, аналогично
]);


Ссылка: http://javascript.ru/ecma/part10#a-10. Особенно можно посмотреть пункт 10.1.3, именно там говорится, что (var'ы, FD, и формальные параметры) и когда (при входе в контекст исполнения) создаётся (попадает в Variable object функции).
__________________
Тонкости ECMAScript

Последний раз редактировалось Dmitry A. Soshnikov, 31.03.2009 в 23:31. Причина: уточнения, поправки
Ответить с цитированием