在油猴脚本中打算 hook 一个 xhr 请求,写出如下代码
    var x = unsafeWindow.$.ajax();
    unsafeWindow.$.ajax = function(args) {
        console.log(args);
        return x.apply(unsafeWindow.$.ajax, args);
    }
结果 Chrome 提示 apply is not a function... console.log 能正常执行,但是为什么最后一行不对呢?
|  |      1eccstartup      2018-05-19 13:19:58 +08:00 via iPhone 自己调用自己? | 
|      2TtiGeR      2018-05-19 13:20:32 +08:00 为什么要造轮子 直接搜 GreaseMonkey Intercept XHR 结果一大把的说 | 
|  |      3wly19960911      2018-05-19 13:22:57 +08:00  1 var x = unsafeWindow.$.ajax(); 这个是 return 的结果,只有 function 才有 apply,你用了()就执行了方法啊,,, | 
|  |      4vegito2002      2018-05-19 13:41:20 +08:00 不太会熟练 js, 这个行不行:  var x = unsafeWindow.$.ajax(); unsafeWindow.$.ajax = function(args) { console.log(args); return function (args) {x.apply(unsafeWindow.$.ajax, args)}; } | 
|  |      5vegito2002      2018-05-19 13:42:27 +08:00  1 application 和 function 之间确实不是一个东西, f 是一个 function, f(1)是一个 application, 这个一般的函数式编程的课程应该都会讲. 不过不会写 ajax, 这里具体的语法看不懂到底在干什么. | 
|  |      6wly19960911      2018-05-19 13:56:47 +08:00 @vegito2002 应该不行,按照需要写的意思, var x = unsafeWindow.$.ajax; 而且最后也不是 return 一个 function,首先是你最后是需要一个 unsafeWindow.$.ajax 的返回值,也就是说你 return 最少是个执行方法的结果吧,但是你这个是 function 了,错误,楼主那个是 x 不是一个 function,所以执行不了 apply 方法。 | 
|  |      7rabbbit      2018-05-19 13:58:39 +08:00 var x = unsafeWindow.$.ajax; | 
|  |      8rabbbit      2018-05-19 14:01:56 +08:00  1 贴一个别的给你参考下 var open = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function() { console.log(this); open.apply(this, arguments); }; | 
|  |      9k9982874      2018-05-19 14:07:19 +08:00 via iPhone 楼主一定是在逗我们 | 
|      10hard2reg OP @wly19960911  @rabbbit 最后一行写成 return hook.call(this, args);可以了,不知道为什么 apply 不行。我是参照这篇写的,https://charlee.li/hook-function-in-greasemonkey.html | 
|      11hard2reg OP @wly19960911  @k9982874 @rabbbit @vegito2002 发现问题了,按理来说 apply 也是可以的。错误如下 ``` var x = unsafeWindow.$.ajax(); // 不应该有括号,应该写成 var x = unsafeWindow.$.ajax ; unsafeWindow.$.ajax = function(args) { console.log(args); return x.apply(unsafeWindow.$.ajax, args); } ``` |