Итак, я не мог узнать, как Function.call не должен принимать первый аргумент как объект, поскольку я не мог найти такую информацию нигде. Хотя я видел сотни использования Function.call, как следующая строка кода, беря только этот объект, подобный массиву, НЕ НЕОБХОДИМ ПЕРВЫЙ ПАРАМЕТР КАК ОБЪЕКТ, ПОТОМУ ЧТО ЭТО ПРИНИМАЕТ АРГУМЕНТЫ ФУНКЦИИ, КОТОРЫЕ ЯВЛЯЮТСЯ ОРИГИНАЛЬНЫМ ОБЪЕКТОМ. Это работает, конечно.Функция.call принимает массив-подобный объект, не требует первого параметра?
argsSliced = Array.prototype.slice.call((function(){return arguments;})(1,2,3,4))
Хотя следующие строки коды ведет себя, как мы ожидаем, что требует первого параметра, чтобы быть объектом, чтобы установить это функцию для этого объекта и требует параметров для передачи функционировать после этого объекта.
var a = function(){return arguments[0] + arguments[1] ; }
console.log(a.call(1,2)); // returns NaN
console.log(a.call(null,1,2)); // behaves as we expect, returns 3
Так что мой вопрос, в чем ситуация с массивным объектом? Как это работает с Function.call, поскольку он не дает ему объект в качестве первого параметра, но только дает объект, похожий на массив.
Что ваш вопрос? В первом примере 'argSliced' вы передаете аргументы pseudo-array в качестве первого (и единственного) параметра' call', поэтому он становится 'this'' 'slice'.Во втором примере, в 'a.call (1,2)', вы передаете '1', как это, в' a', '2' в качестве первого параметра, и ничего как второй параметр, поэтому' arguments [1 ] 'undefined, и вы получаете NaN. В следующем вызове вы передаете null как это: 'a',' 1' в качестве первого параметра и '2' в качестве второго параметра, поэтому он возвращает 3, очевидно. –
Посмотрите на выражение 'function() {return arguments;}) (1, 2, 3, 4)', которое передается как первый параметр 'call', и, таким образом,' this' to 'slice '. Он вызывает анонимную функцию с параметрами '(1, 2, 3, 4)', что, следовательно, возвращает аргумент (массив), содержащий '[1, 2, 3, 4]'. –
Не понимаю, что вы имеете в виду, говоря: «Это не передается на срез». Первый аргумент 'Array.prototype.slice.call' становится' this' для 'slice'. Во втором примере вы не используете 'this' вообще. 'slice' и' a' принципиально разные, потому что 'slice' работает в массиве' this' или в виде массива, тогда как 'a' не имеет' this'. –