// 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) {
// Remember original method in the closure
var original = o[m];
// Define the new method
o[m] = function() {
// Log message
console.log(new Date(), "Entering:", m);
// Invoke original
var result = original.apply(this, arguments);
// Log message
console.log(new Date(), "Exiting:", m);
return result;
};
}
您好!上面給出的代碼示例來自我的編碼書。它嘗試使用JavaScript中的apply
函數來說明一種名爲「猴子補丁」的練習。我真搞不清楚該行的性質原函數被調用:JS中的執行上下文感到困惑
var result = original.apply(this, arguments); // Invoke original.
據我瞭解,原來的函數調用也無apply()
幫助下寫的,因爲thisarg是this
,也就是說執行上下文保持不變:original
對象。
第二個困惑點是地獄arguments
參數apply()
來自哪裏?是的,我知道它是在每個函數調用中生成的一個對象,用於訪問函數參數 - 但此行位於不帶任何參數的匿名函數內。我沒有任何線索,並且很感激任何暗示。
預先感謝您!
@dayuloli那個本地執行環境會是什麼?爲了再次引用我的書,「函數使用範圍鏈在執行定義時生效」,這並不意味着執行環境是匿名函數嗎? –
如果執行上下文是anynomous函數的執行上下文,那麼這是否意味着'arguments'對象是空的(因爲該函數沒有任何參數)?那會是什麼意思?我不想使用原始函數會收到的參數嗎? –
「* thisarg是'this',這就是說執行上下文保持不變:'original' object *」 - 否'original'是應該調用的函數(方法)引用,它不是上下文。而且你不知道'this'上下文是否是'o'(方法被覆蓋的對象) - 它可以是任何東西。因此,我們使用'this'。 – Bergi