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 функции).