V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hard2reg
V2EX  ›  问与答

apply is not a function,求 js 大神

  •  
  •   hard2reg · 2018-05-19 13:01:45 +08:00 · 4292 次点击
    这是一个创建于 2388 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    11 条回复    2018-05-19 19:56:28 +08:00
    eccstartup
        1
    eccstartup  
       2018-05-19 13:19:58 +08:00 via iPhone
    自己调用自己?
    TtiGeR
        2
    TtiGeR  
       2018-05-19 13:20:32 +08:00
    为什么要造轮子

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

    var x = unsafeWindow.$.ajax;

    而且最后也不是 return 一个 function,首先是你最后是需要一个 unsafeWindow.$.ajax 的返回值,也就是说你 return 最少是个执行方法的结果吧,但是你这个是 function 了,错误,楼主那个是 x 不是一个 function,所以执行不了 apply 方法。
    rabbbit
        7
    rabbbit  
       2018-05-19 13:58:39 +08:00
    var x = unsafeWindow.$.ajax;
    rabbbit
        8
    rabbbit  
       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);
    };
    k9982874
        9
    k9982874  
       2018-05-19 14:07:19 +08:00 via iPhone
    楼主一定是在逗我们
    hard2reg
        10
    hard2reg  
    OP
       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
        11
    hard2reg  
    OP
       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);
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:11 · PVG 14:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.