2015-12-19 1 views
-2

Итак, я не мог узнать, как 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, поскольку он не дает ему объект в качестве первого параметра, но только дает объект, похожий на массив.

+2

Что ваш вопрос? В первом примере 'argSliced' вы передаете аргументы pseudo-array в качестве первого (и единственного) параметра' call', поэтому он становится 'this'' 'slice'.Во втором примере, в 'a.call (1,2)', вы передаете '1', как это, в' a', '2' в качестве первого параметра, и ничего как второй параметр, поэтому' arguments [1 ] 'undefined, и вы получаете NaN. В следующем вызове вы передаете null как это: 'a',' 1' в качестве первого параметра и '2' в качестве второго параметра, поэтому он возвращает 3, очевидно. –

+1

Посмотрите на выражение 'function() {return arguments;}) (1, 2, 3, 4)', которое передается как первый параметр 'call', и, таким образом,' this' to 'slice '. Он вызывает анонимную функцию с параметрами '(1, 2, 3, 4)', что, следовательно, возвращает аргумент (массив), содержащий '[1, 2, 3, 4]'. –

+1

Не понимаю, что вы имеете в виду, говоря: «Это не передается на срез». Первый аргумент 'Array.prototype.slice.call' становится' this' для 'slice'. Во втором примере вы не используете 'this' вообще. 'slice' и' a' принципиально разные, потому что 'slice' работает в массиве' this' или в виде массива, тогда как 'a' не имеет' this'. –

ответ

0

MDN для вызова() объясняет это ясно: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

Значение this предусмотрено для вызова функционировать. Следует отметить, что это не может быть фактическое значение видно по методу: если метод является функцией в нестрогом режим кода, недействительным и не определено, будет заменен на глобального объекта и примитивные значения будут преобразованы к объектам.

var a = function(){return arguments[0] + arguments[1] ; } 
console.log(a.call(1,2)); 

аргументы [1] будет undefined и 2 будет arguments[0], потому что 1 будет в штучной упаковке к объекту.

запомнить f.call(ob,4);, как говорят ob.f(4)

+1

, пожалуйста, объясните нижний предел, если я сделал что-то неправильно, по крайней мере, дайте мне знать – Ramanlfc

+1

Но OP вызывает 'call' с объектом в качестве первого аргумента, а не примитивным. Я не вижу, как это относится к вопросу. – Oriol

2

Эта функция, при вызове, возвращает массив типа Аргументы объекта с аргументами

var f = function(){return arguments;}; 

Затем, когда вы вызываете его с аргументами 1, 2, 3 и 4,

f(1,2,3,4) // Arguments [1,2,3,4] 

Затем вы вызываете Function.prototype.call по адресу Array.prototype.slice, передавая объект Arguments в качестве аргумента.

Так Function.prototype.call позвонит Array.prototype.slice со значением, установленным в this аргументы не приемлю (вместо Array.prototype), и никаких аргументов.

Когда Array.prototype.slice вызывается в массив-подобном объекте, он строит реальный массив из этого объекта. Таким образом, вы получите

Array.prototype.slice.call(f(1,2,3,4)); // Array [1,2,3,4] 

Примечания есть лучшие способы для достижения этой цели:

Array.of(1,2,3,4) 
Array(1,2,3,4) 
[1,2,3,4] 
+0

Спасибо за ответ, я запутался, и это не вопрос. Извините за беспокойство. – FurkanO

Смежные вопросы