Когда функция возвращает результат, а когда функция в JavaScript - PullRequest
7 голосов
/ 22 марта 2011

Я вижу, что функция возвращает НЕ результат, а функцию.В приведенном ниже примере показано, что функция getWindow возвращает функцию.Почему он не может просто вернуть переменную "win"?Когда я верну результат и когда функция?Спасибо.

var A = function(){};
A.prototype=
{
   getWindow : function()
   {
        var win = new B.window();
        return (
                this.getWindow = function()
                {
                    return win;
                })();

   }
}

1 Ответ

4 голосов
/ 22 марта 2011

Этот код эквивалентен вашему коду, но его легче понять:

A.prototype = {
    getWindow: function() {

        var win = new B.window();

        this.getWindow = function() {
            return win;
        };

        return win;

    }
}

Использование:

Сначала создайте экземпляр A:

var a = new A();

Затем вызовите getWindow для этого экземпляра:

a.getWindow();

Здесь вызывается getWindow метод A.prototype. Как вы можете видеть в моем коде выше, A.prototype.getWindow создаст new B.window() и вернет его , однако между ними он также создаст getWindow метод на объекте экземпляра сам.

Теперь, если вы снова позвоните getWindow:

a.getWindow();

A.prototype.getWindow больше не вызывается , поскольку сам объект экземпляра имеет метод getWindow. Этот метод возвращает тот же объект «win», который был возвращен при первом вызове метода getWindow.


Ваш шаблон позволяет нескольким A экземплярам использовать один и тот же метод A.prototype.getWindow для создания своих собственных объектов "win". Учтите это:

var a1 = new A,
    a2 = new A,
    a3 = new A;

a1.getWindow(); // creates window W1 and returns it
a2.getWindow(); // creates window W2 and returns it

a1.getWindow(); // returns window W1
a2.getWindow(); // returns window W2

a3.getWindow(); // creates window W3 and returns it

a1.getWindow(); // returns window W1
a2.getWindow(); // returns window W2
a3.getWindow(); // returns window W3

Это довольно полезный паттерн :)


Обновление:

Это ваш код:

return (this.getWindow = function() {
    return win;
})();

Во-первых, давайте посмотрим на выражение в скобках:

this.getWindow = function() { return win; }

Как видите, это выражение присваивания. Объект анонимной функции назначается свойству getWindow объекта, на который ссылается this (объект экземпляра).

Обратите внимание, что эта функция возвращает объект win.

Результатом этого выражения присваивания является сам объект функции! Это означает, что значение в скобках является объектом функции.

Теперь давайте посмотрим на всю картину:

return ( the_function_object )();

Мы можем удалить парены, поскольку они нам больше не нужны:

return the_function_object();

Как видите, объект функции вызывается, и затем возвращается возвращаемое значение этой функции.

Как упоминалось выше, функция возвращает win. Следовательно, код разрешается следующим образом:

return win;

Итак, что делает ваш код:

FIRST назначает function() { return win; } на this.getWindow.

ВТОРОЙ, он возвращает результат вызова той функции, которая win.

Мой код дает тот же результат, но его легче понять:

this.getWindow = function() {
    return win;
};

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