当函数返回结果和JavaScript中的函数时

时间:2011-03-22 19:45:45

标签: javascript javascript-framework

我看到很多函数返回的不是结果而是函数。 下面的示例显示函数 getWindow 返回函数。为什么它不能只返回变量“赢”?当我返回结果和功能时? 谢谢。

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

   }
}

1 个答案:

答案 0 :(得分:4)

此代码与您的代码相同,但更容易理解:

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方法。此方法返回第一次调用getWindow方法时返回的相同“win”对象。


您的模式允许多个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;
})();

首先,让我们看一下parens中的表达式:

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

如您所见,这是一个赋值表达式。将匿名函数对象分配给getWindow(实例对象)引用的对象的this属性。

请注意,此函数返回win对象。

此赋值表达式的结果是函数对象本身!这意味着parens中的值是函数对象。

现在,我们来看看整个图片:

return ( the_function_object )();

我们可以删除parens,因为我们不再需要它们了:

return the_function_object();

如您所见,调用函数对象,然后然后返回该函数的返回值。

如上所述,该函数返回win。因此,代码解析为:

return win;

所以你的代码所做的是:

首先,它将function() { return win; }分配给this.getWindow

SECOND,它返回调用该函数win的结果。

我的代码产生相同的结果,但更容易理解:

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

return win;