【问题标题】:JavaScript: Closures referring to 'this' keywordJavaScript:引用“this”关键字的闭包
【发布时间】:2015-09-20 13:22:34
【问题描述】:

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

deentityify 方法的闭包中提到的this 指的是执行该方法的字符串对象。这对我来说不太有意义 - 这里的 this 不应该指的是全局对象吗?

【问题讨论】:

  • 哦....我现在知道了...闭包作为 deentityify 方法返回,
  • 你不能仅仅通过分析函数定义来假设this的值。例如var fn = String.deentityfy; fn(); //this === window。这就是你如何调用你的函数以及你如何绑定它。
  • 是的,我明白了,我没有在这个问题中包括,事后看来应该是执行上下文......实际上我确实在问题结束时描述了执行上下文“ ...执行此方法的字符串对象"
  • 执行上下文是“somestring”.deentityify()

标签: javascript closures this


【解决方案1】:

如果我们在没有很好的作用域(即使用丑陋的全局变量)和方法绑定方法的情况下编写此代码,您会得到:

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 对象上的一个方法。当您使用点语法调用该方法时,该方法的上下文是您调用它的字符串。

【讨论】:

    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多