“this”关键字在以下Javascript代码中引用了什么?

时间:2014-11-15 16:26:43

标签: javascript function closures monkeypatching

这是来自 JavaScript:David Flanagan的权威指南

的示例
//Replace the method named m of the object o with a version that logs messages before and after invoking the original method.

function trace(o, m) {
  var original = o[m];                            // Remember original method in the closure.
  o[m] = function() {                             // Now define the new method.
    console.log(new Date(), "Entering:", m);      // Log message.
    var result = original.apply(this, arguments); // Invoke original.
    console.log(new Date(), "Exiting:", m);       // Log message.
    return result;                                // Return result.
  };
}

据我所知,因为m是o的一种方法,所以'这个'应该参考对象o。但我无法理解如何;因为在一个功能中这个'应该引用全局对象(非严格模式) 此外,'论证如何?数组包含原始函数的参数,而不包含匿名包装函数的参数?

1 个答案:

答案 0 :(得分:-1)

trace函数将使用包装器替换对象中的方法,该包装器将输出一些日志中介并调用原始方法。

匿名函数是将被调用而不是原始方法的包装器。当它被调用时,它被称为对象的方法,因此this将引用该对象。

请注意,匿名函数不会在trace函数中执行。它取代了原始方法,因此稍后将调用原始方法。

arguments数组是包装函数的参数,因此它将是原始方法的参数。这就是为什么在调用原始方法时传递它们的原因。

如果您有这样的对象:

var html = {
  bold: function(x) {
    return "<strong>" + x + "</strong>";
  }
};

如果您现在使用trace功能:

trace(html, 'bold');

现在html对象将包含等效的:

{
  bold: function() {
    var m = 'bold';
    var original = function(x) {
      return "<strong>" + x + "</strong>";
    };
    console.log(new Date(), "Entering:", m);
    var result = original.apply(this, arguments);
    console.log(new Date(), "Exiting:", m);
    return result;
  }
}