apply is not a function,求 js 大神

2018-05-19 13:01:45 +08:00
 hard2reg

在油猴脚本中打算 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 能正常执行,但是为什么最后一行不对呢?

4290 次点击
所在节点    问与答
11 条回复
eccstartup
2018-05-19 13:19:58 +08:00
自己调用自己?
TtiGeR
2018-05-19 13:20:32 +08:00
为什么要造轮子

直接搜 GreaseMonkey Intercept XHR 结果一大把的说
wly19960911
2018-05-19 13:22:57 +08:00
var x = unsafeWindow.$.ajax(); 这个是 return 的结果,只有 function 才有 apply,你用了()就执行了方法啊,,,
vegito2002
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)};
}
vegito2002
2018-05-19 13:42:27 +08:00
application 和 function 之间确实不是一个东西, f 是一个 function, f(1)是一个 application, 这个一般的函数式编程的课程应该都会讲. 不过不会写 ajax, 这里具体的语法看不懂到底在干什么.
wly19960911
2018-05-19 13:56:47 +08:00
@vegito2002 应该不行,按照需要写的意思,

var x = unsafeWindow.$.ajax;

而且最后也不是 return 一个 function,首先是你最后是需要一个 unsafeWindow.$.ajax 的返回值,也就是说你 return 最少是个执行方法的结果吧,但是你这个是 function 了,错误,楼主那个是 x 不是一个 function,所以执行不了 apply 方法。
rabbbit
2018-05-19 13:58:39 +08:00
var x = unsafeWindow.$.ajax;
rabbbit
2018-05-19 14:01:56 +08:00
贴一个别的给你参考下
var open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
console.log(this);
open.apply(this, arguments);
};
k9982874
2018-05-19 14:07:19 +08:00
楼主一定是在逗我们
hard2reg
2018-05-19 19:53:12 +08:00
@wly19960911
@rabbbit

最后一行写成 return hook.call(this, args);可以了,不知道为什么 apply 不行。我是参照这篇写的,https://charlee.li/hook-function-in-greasemonkey.html
hard2reg
2018-05-19 19:56:28 +08:00
@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);
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/456111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX