создание шпионской функции с помощью javascript

#javascript

#javascript

Вопрос:

Я пытаюсь создать шпионскую функцию, которая будет это делать.

 const func1 = function (x, y) {return x   y};
const func2 = spy(func1);
func2(2, 5) // => 7
func2(4, 5) // => 9
func2.calls() // => 2
func2.args() // => [[2, 5], [4, 5]]
  

Я создал эту функцию, но, похоже, могу получать вызовы и аргументы

 function spy(func) {
  let count = 0;
  let allArgs = [];
    function ispy() {
        let args2 = Array.prototype.slice.call(arguments);
        spy.calls = function() {
           return count  ;
        }
        spy.args = function() {
          return allArgs.push(args2)
        }
        func.apply(this, args2);
    }
    
    return spy;
}

const func1 = function (x, y) {return x   y};
const func2 = spy(func1);
console.log(func2(2, 5)) 
console.log(func2.calls())
console.log(func2.args())   

Пожалуйста, помогите мне исправить это и дайте мне знать, чего мне не хватает?

Комментарии:

1. Переменные внутри метода spy имеют слишком низкую область видимости. Счетчик создается, инициализируется и уничтожается при каждом вызове.

2. На самом деле, вы допустили ошибку при возврате spy и не ispy ?

3. Кроме того, почему calls() и args() корректируют переменные ведения записей, а не просто сообщают о них?

4. и вы добавляете функции в spy при вызове ispy() и увеличиваете count при вызове calls ispy вместо вызова из и многих других ошибок…

Ответ №1:

Несколько вещей, вам нужно отслеживать count и allArgs для каждого вызова шпионского вызова. Вам нужно вернуть результат шпионской функции из spy.

 function spy(func) {
  let count = 0;
  let allArgs = [];
  function spy() {
      // increment count on every invocation
      count  ;
      let args2 = Array.prototype.slice.call(arguments);
      // shove arguments onto the allArgs array.
      allArgs.push(args2);
      spy.calls = function() {
         return count;
      }
      spy.args = function() {
        return allArgs;
      }
      
      //return the resu<
      return func.apply(this, args2);
  }
    
    return spy;
}

const func1 = function (x, y) {return x   y};
const func2 = spy(func1);
console.log(func2(2, 5)) 
console.log(func2.calls())
console.log(func2.args())   

Ответ №2:

Вы добавляете функции для слежки в вызов ispy() и увеличиваете количество вызовов в вызове вызовов вместо вызова ispy, вы не возвращаете результат функции, вы назначаете функции calls и args при каждом вызове ispy и многие другие ошибки

 function spy(func) {
  let count = 0;
  let allArgs = [];
  function ispy(...args) {
      count  ;
      allArgs.push(args);
      return func.apply(this, args);
  }

  ispy.calls = function() {
     return count;
  }
  ispy.args = function() {
    return allArgs;
  }
    
  return ispy;
}

const func1 = function (x, y) {return x   y};
const func2 = spy(func1);
console.log(func2(2, 5));
console.log(func2(4, 5));
console.log(func2.calls())
console.log(func2.args())   

Ответ №3:

Вы могли бы принимать аргументы напрямую с параметрами rest и возвращать в функцию только значения переменных. Назначение должно происходить вне функции, потому что в противном случае сначала потребуется вызов func2 .

Каждый вызов ispy должен быть подсчитан, и аргументы должны быть добавлены к.

 function spy(func) {
    function ispy(...args) {
        count  ;
        allArgs.push(args);
        return func.apply(this, args);
    }

    let count = 0;
    let allArgs = [];
    ispy.calls = () => count;
    ispy.args = () => allArgs;

    return ispy;
}

const func1 = function (x, y) {return x   y};
const func2 = spy(func1);

console.log(func2.calls())
console.log(func2(2, 5)) 
console.log(func2.calls())
console.log(func2.args())