Самовывоз JavaScript - PullRequest
0 голосов
/ 26 июля 2011

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

function Test() {
    this.number = 10;
    this.square = (function(test) {return test.number * test.number}(this));
}

Но когда я делаю это:

var test = new Test();

console.log(test.number + " * " + test.number + " = " + test.square);
test.number = 20;
console.log(test.number + " * " + test.number + " = " + test.square);

Вывод на консоль:

10 * 10 = 100
20 * 20 = 100

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

Ответы [ 5 ]

1 голос
/ 26 июля 2011

Вы создаете анонимную функцию, которая вычисляет значение члена .number его аргумента и вызывает его с помощью this. Расчет выполняется раз и навсегда, и результат (100, поскольку this.number равен 10 в этой точке) сохраняется в self.square.

Чтобы отразить изменения в атрибуте .number, вам нужно сделать его обычным методом для вызова квадрата по требованию. Javascript не имеет свойств (не кросс-браузерным способом, то есть), чтобы скрыть вызов метода и сделать его похожим на обычный доступ к атрибутам (и даже в этом случае синтаксис объявления одного будет другим).

1 голос
/ 26 июля 2011

Весь смысл функции, вызывающей саму себя, заключается в том, что она вызывается правильно при объявлении.Если вы этого не хотите, вы должны сделать ее нормальной функцией и вызывать ее с помощью test.square ().

0 голосов
/ 26 июля 2011

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

this.square = (function(test) {return function(){return test.number * test.number;}})(this);
//(this) goes outside the parentheses

Вы можете позвонить по этому номеру:

var test = new Test();
test.square();  //returns 100
test.number = 50;
test.square();  //returns 2500
0 голосов
/ 26 июля 2011

Как и все остальные, test.square рассчитывается один раз, когда вы создаете объект, и никогда больше.Исходя из того, что вы говорите, я считаю, что вы хотите создавать свойства, а не функции, поэтому я бы создал ваш объект для получения параметров.

function Test(numberArgument) {
this.number = numberArgument;
this.square = ....etc
}
0 голосов
/ 26 июля 2011

Я думаю

this.square = (function(test) {return test.number * test.number}(this));

на самом деле сохранен результат вызова функции?«(this)» в конце оператора заставляет меня думать, что вы вызвали функцию, а не хранить функцию в this.square, как я думаю, вы хотели ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...