在Function.prototype中访问“this”是不可能的?

时间:2014-09-29 13:25:23

标签: javascript

我正在尝试扩展函数原型以返回函数的单例版本。

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; 
  } 
}

控制台记录窗口对象。为什么这个!=当前功能?以及如何解决这个问题?

3 个答案:

答案 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);
}