Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

В чем принципиальная разница между call/apply и почему код так работает?

Всем привет. Разрешите задать нубский вопрос по CALL/APPLY, может кто-то разжуёт Как следует из многих туториалов и учебников call отличается от apply тем, что в apply аргументом можно передать массив. А в call нет.
var object = { "arr": ["Первый элемент",2,3,4,5], "func": function() { function awayFromMe(arr){ console.log(arr); } awayFromMe.call (this, this.arr); awayFromMe.apply(this, this.arr); } }; object.func();
То-есть я рассчитывал что call ничего не даст, a apply отработает, но вопреки моим ожиданиям call дал вывод массива:["Первый элемент", 2, 3, 4, 5] apply дал вывод только первого элемента: "Первый элемент"
Почему так происходит?


Ответ

Путём проб и ошибок, мне кажется я уловил тонкий смысл различия между call/apply и хотел бы им с Вами поделиться, может ещё будет такой(-ая) же как я. Итак, допустим, у нас есть простая заданная функция, которая возвращает сумму двух чисел:
function sumTwoNumb(a, b){ return a + b; }
Код крайне простой, мы передаём два аргумента в параметры функции, а она возвращает сумму. И допустим, нам надо вызвать эту функцию для двух элементов некоего массива.

Если мы вызовем её как: sumTwoNumb.call(null, [100,150]), то получится так, что первый параметр a получит аргументом весь массив [100,150], а второй параметр, b не получит ничего и станет, соответственно, undefined. И в итоге функция вернёт результат сложения [100,150]+undefined, а это равно 100,150undefined

А если мы её вызовем так: sumTwoNumb.apply(null, [100,150]), то при входе в функцию первый параметр a получит нулевой элемент массива = 100, а второй параметр получит первый элемент массива = 150 и в итоге функция вернёт результат сложения 100 + 150, то есть верный.
Уважаемые профессионалы, если я не прав, поправьте. Надеюсь, кому-то пригодится.

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

Отправить комментарий