#48 间谍活动


  • 0

    为什么我这么写显示不对啊,说没有用calls记录行为

    const spy = (fn) => {
      return function b(){
        b.calls=b.calls||[]
        let res=fn.apply(this,arguments)
        b.calls.push({args:[...arguments],result:res})
        return res
      }
    }
    

  • 0
    administrators

    @physihan 这样改:

    const spy = (fn) => {
      const calls = []
      function b(){
        let res=fn.apply(this,arguments)
        b.calls.push({args:[...arguments],result:res})
        return res
      }
      b.calls = calls
      return b
    }
    

  • 0

    @胡子大哈 好吧,在里面写不行啊,我估计我这样写函数没调用是不能获取到calls属性的,谢谢了


  • 0

    此回复已被删除!

  • 0

    哇,充了会员看了半天.也没知道我怎么错的.这this

    const spy = (fn) => {
      function spyFn(){
        //执行方法
        params = Array.prototype.slice.call(arguments)
        let result = fn.bind(this)(...params); 
        //记录
        spyFn.calls.push({
          args:params,
          result:result
        })
        return result;
      }
      spyFn.calls = [];
      return spyFn
    }
    

  • 0

    我想问一下,我在返回的函数里,直接调用fn(args) 和 使用fn.apply(null,args)有啥区别啊
    为啥第一种就不行,第二种可以呢?
    上代码:

    const spy = (fn) => {
    	let calls = [];
    	let a = function(...args){
    		let res = [];
    		res["args"] = [args];
    		res["result"] = fn.apply(null,args);//这里写fn(null,args)就不行
    		calls.push(res);
    		return res["result"];
    	}
    	a.calls = calls
    	return a
    }
    

  • 0

    @陈小俊#48 间谍活动 中说:

    this

    这样this还是指向window,


  • 0

    利用Proxy或者返回一个新函数。都跟闭包的使用有关。


  • 0

    const spy = (fn) => {
      let resFn = function (...rest) {
        const result = fn.apply(this, rest);
        resFn.calls.push({
          args: rest,
          result,
        });
        return result
      };
      resFn.calls = [];
      return resFn
    };
    

    想过用Proxy实现,但是使用了Proxy的话会导致原有的函数被修改,我没想到使用Proxy不修改原函数的方法。

    笨死了。

    const spy = (fn) => {
      let calls = [];
      const resFn = new Proxy(fn, {
        apply(target, thisArg, argumentsList) {
          const result = Reflect.apply(target, thisArg, argumentsList);
          calls.push({
            args: argumentsList,
            result,
          });
          return result;
        }
      });
      resFn.calls = calls;
      return resFn
    };
    

  • 1

    国家怎么可以随随便便地把这么重要的任务托付给我。。。


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待