我正在尝试扩展函数原型以返回函数的单例版本。
Function.prototype.once = function() {
var called = false, memo;
return function() {
console.log('AP', this);
if (!called) memo = this.apply(this, arguments);
called = true;
return memo;
}
}
控制台记录窗口对象。为什么这个!=当前功能?以及如何解决这个问题?
答案 0 :(得分:7)
你不能关闭" this
,因此您需要使用旧的var self = this
技巧(即,在可以关闭的变量中获取对this
的引用)或简单地绑定你的函数:
return function() {
console.log('AP', this);
if (!called) memo = this.apply(this, arguments);
called = true;
return memo;
}.bind(this);
答案 1 :(得分:4)
当然,这是可能的,但是您的内部函数会创建一个新的上下文,因此其中的this
与外部的this
不同。
只需创建对原始函数的外部引用:
Function.prototype.once = function() {
var f = this; // use 'f' in the inner function
...
}
注意:根据您的意图,arguments
也可能存在同样的问题。
答案 2 :(得分:1)
您必须绑定到匿名函数的上下文。
Function.prototype.once = function() {
var called = false, memo;
return (function() {
console.log('AP', this);
if (!called) memo = this.apply(this, arguments);
called = true;
return memo;
}).bind(this);
}