JavaScript: контекст выполнения, когда ссылка на функцию хранится в массиве - PullRequest
0 голосов
/ 28 мая 2020

Рассмотрим следующий код:

var obj = {
  name: 'Hans',
  print: function(p) {
    console.log(this.name)
  }
};
obj.print(); // prints 'Hans'

Мы знаем, что функция print вызывается для объекта obj. Другими словами, obj является (частью) контекста выполнения print. Легко, правда?

Вот что я пытаюсь понять: подумайте о том, чтобы сохранить ссылку на функцию в массиве:

var funcs = [function(p) {
  console.log(this.length, this)
}];
funcs[0](); // prints 1 which is the length of the array 'func' and also [ [Function] ]

Это означает, что контекст выполнения первого элемента в массиве при его запуске - это сам массив !! Я предполагал, что то, что хранится в массиве, является не чем иным, как ссылкой на функцию, поэтому это эквивалентно этому:

var f = function(p) {
  console.log(this)
};
var funcs = [f];
f(); // prints Window

, что оказывается неверным. Что мне здесь не хватает?

1 Ответ

2 голосов
/ 28 мая 2020

Результат, который вы видите, заключается в том, что массивы на самом деле являются объектами, а индексы массивов - это свойства, которые имеют имена c numeri. Когда свойство содержит функцию, и вы вызываете object.property() или object["property"](), контекст this является объектом.

Но это происходит только тогда, когда вы вызываете функцию с помощью средства доступа к свойству или синтаксиса индекса массива. Связь с объектом теряется, если вы назначаете функцию какой-либо другой переменной и вызываете функцию через нее. Вот почему вы видите объект window в последнем фрагменте.

Вы увидите тот же эффект в первом фрагменте, если измените obj.print() на

var foo = obj.print;
foo();
...