这是来自 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。但我无法理解如何;因为在一个功能中这个'应该引用全局对象(非严格模式) 此外,'论证如何?数组包含原始函数的参数,而不包含匿名包装函数的参数?
答案 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;
}
}