JavaScript:关闭'这个'关键词

时间:2015-09-20 13:22:34

标签: javascript closures this

以下示例,我在Douglas Crockfords" JavaScript - The Good Parts"中看到的,似乎破坏了我目前对this在闭包内如何工作的理解:

    String.method('deentityify', function(){
          var entity = {
              quot: '"',
              lt: '<',
              gt: '>'
          };

         return function(){
                return this.replace(/&([^&;]+);/g, 
                    function(a,b){
                        var r = entity[b];
                        return typeof r === 'string' ? r : a;
                    } 
       };
}());   


//Just for reference
Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

this方法的闭包中引用的deentityify引用执行此方法的字符串对象。这对我来说没有意义 - 这里this不应该引用全局对象吗?

1 个答案:

答案 0 :(得分:3)

如果我们在没有很好的范围(即使用丑陋的全局变量)和方法绑定方法的情况下编写这个,你得到:

var entity = {
  quot: '"',
  lt: '<',
  gt: '>'
};

String.prototype.deentityify = function(){
  return this.replace(/&([^&;]+);/g, 
    function(a,b){
      var r = entity[b];
      return typeof r === 'string' ? r : a;
    }
  );
};

var s = "&lt;".deentityify();

因此,deentityify只是String对象上的一种方法。使用点语法调用方法时,方法的上下文是您调用它的字符串。