我看到很多函数返回的不是结果而是函数。 下面的示例显示函数 getWindow 返回函数。为什么它不能只返回变量“赢”?当我返回结果和功能时? 谢谢。
var A = function(){};
A.prototype=
{
getWindow : function()
{
var win = new B.window();
return (
this.getWindow = function()
{
return win;
})();
}
}
答案 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;