#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())