Путаница с Function.prototype.bind()

Я большой поклонник ES5 Function.prototype.bindи каррирования аргументов (, которые в основном создают аргументы по умолчанию для функций ).

Я немного дурачился с этим, но я больше не могу понять свою собственную конструкцию. Это моя игровая площадка:

function hello( arg1, arg2 ) {
    console.log('hello()');
    console.log('"this" is: ', this);
    console.log('arguments: ', arguments);
}

var foo = Function.prototype.call.bind( hello,{what: 'dafuq'}, 2 );
foo( 42 );

Вывод журнала для этого выглядит следующим образом:

hello()
"this" is: Object{ what="dafuq" }
arguments: [2,42]

Но я не понимаю, как объект {what: 'dafuq'}пробивается как ссылка на thisвнутри foo. Насколько я понимаю, мы создаем связанный вызов с на Function.prototype.call. Давайте быстро проверим синопсис MDN для .bind():

fun.bind(thisArg[, arg1[, arg2[,...]]])

Итак, thisArgвместо .call— это функция hello, за которой следует список аргументов. В основном происходит вот что

Function.prototype.call.call( hello, {what: 'dafuq'}, 2);

...уууххх теперь мой мозг немного болит. Я думаю, что теперь у меня есть представление о том, что происходит, но, пожалуйста, кто-нибудь найдет хорошие слова, чтобы объяснить это подробно.

  • как {what: 'dafuq'}становитсяthis reference
13
задан Bergi 25 May 2014 в 17:22
поделиться