Программист, написавший этот код, знал, что какая-то другая часть программы вызывает splice
для этого массива, и он хотел прикрепить к нему событие, чтобы обновить пользовательский интерфейс (отсюда и вызов jQuery) .
Это обычно называется "Обезьяньей заплаткой". Вы можете прочитать об этом на https://www.audero.it/blog/2016/12/05/monkey-patching-javascript/
Это не очень хорошая практика , поскольку она запутывает происходящее: ни один программист не ожидал бы, что вызов функции манипулирования данными имеет побочные эффекты где-то еще.
Вы можете запустить этот пример, чтобы понять, как он работает:
const myArray = [];
// Patch push method only for this instance of array.
myArray.push = function() {
// log event
console.log('myArray.push was called with the following arguments', arguments);
// Call the original push function with the provided arguments.
return Array.prototype.push.apply(this, arguments);
}
myArray.push(1);
Вы также можете исправлять методы для всех экземпляров данного класса:
// Patch push method on all arrays
const originalPush = Array.prototype.push;
Array.prototype.push = function() {
// log event
console.log('.push was called with the following arguments', arguments);
// Call the original push function with the provided arguments.
return originalPush.apply(this, arguments);
}
const myArray = [];
myArray.push(1);
Что касается вашего вопроса о arguments
, то в javascript все функции могут обращаться к массивному объекту arguments
, содержащему аргументы, с которыми была вызвана функция, не зависящим от того, какие аргументы указаны в исходном объявлении. .
function doSomething(arg1) {
console.log(arguments[2]);
}
doSomething(1, 2, 3); // outputs "3"
Вот документация MDN об этом: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments