В этом фрагменте кода, почему «this» окончательно привязывается к объекту окна, а не к массиву b? - PullRequest
1 голос
/ 20 мая 2019
"use strict";
const a=[1,2,30];
const b=[4,5,60];
const c=[7,8,90];
a.forEach((function (){
  console.log(this);
}).bind(globalThis),b);

В этом фрагменте кода JavaScript оба из bind() и второй параметр forEach() используются для привязки this. Для bind(), this будет ponit к объекту окна, в то время как для второгопараметр forEach() будет указывать на массив b. Но, наконец, он перехватывает оконный объект 3 раза. Почему? Это относится к порядку выполнения кода или приоритету этой привязки в этих двух методах?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

После привязки функция не может быть снова связана

let x = function(v,t) { console.log(this.name, v, t);}
x('unbound', 'arg2');                      // outputs [window.name unbound arg2]
x.bind({name:1}, 'one', 'arg2')();                // outputs [1 one arg2]
x.bind({name:2}, 'two', 'arg2')();                // outputs [2 two arg2]
x.bind({name:3}, 'three').bind({name:4}, 'four')(); // outputs [3 three four] rather than [4 four undefined]

Вы можете видеть, с последней функцией, three привязан к первому аргументу, four привязан ко второму аргументу, но this остается какэто было с первым bind

Возможно, изучение результатов поможет

const fn = function (...args) { console.log (this.This, args.join(' ')); }
const fnBound1 = fn.bind({This: 1});
const fnBound2 = fn.bind({This: 2}, '2bound1');
const fnBound3 = fn.bind({This: 3}, '3bound1', '3bound2');
const fnBound4 = fnBound1.bind({This: 4}, '4bound1');
const fnBound5 = fnBound4.bind({This: 5}, '5bound1', '5bound2');

fnBound1('1arg1', '1arg2', '1arg3');
fnBound2('2arg1', '2arg2', '2arg3');
fnBound3('3arg1', '3arg2', '3arg3');
fnBound4('4arg1', '4arg2', '4arg3');
fnBound5('5arg1', '5arg2', '5arg3');
0 голосов
/ 20 мая 2019

Чтобы иметь доступ к this или b, используйте функции стрелок вместо привязки

a.forEach(() => {
  console.log(this,b);
})

"use strict";


const a=[1,2,30];
const b=[4,5,60];
const c=[7,8,90];

a.forEach(() => {
  console.log(this,b);
})
...