如何猴子修补在另一个函数内声明的函数

How to monkey-patch a function declared inside another function

假设我有以下代码:

window.foo = function() {
  bar();
  function bar() {
    console.log('hello');
  }
}
/* insert monkey-patching code here */
foo();

我可以用什么代码替换 /* insert monkey-patching code here */ 来实现这个,例如在控制台上写 goodbye 而不是 hello

我尝试了以下方法来覆盖 bar,但它不起作用:

window.foo = function() {
  bar();
  function bar() {
    console.log('hello');
  }
}
window.bar = function() {
  console.log('goodbye');
}
window.foo.bar = function() {
  console.log('goodbye');
}
foo();

你不能。

该函数存储在 foo 内的局部变量中。无法从该函数外部访问它。

您需要:

  • 替换整个foo
  • 重构 foo 以便 bar 在更广泛的范围内声明(并且可以从您想要更改它的地方访问)