Был ли забавный велосипед c () вверху перекрыт другой функцией внизу? - PullRequest
0 голосов
/ 11 апреля 2020
var bike = function() {
  console.log(this.name);
}
var name = "Ninja";
var obj1 = { name: "Pulsar" };
var obj2 = { name: "Gixxer" };

var originalBikeFun = bike;
bike = function() {
  originalBikeFun.call(obj1);
};

bike();           // "Pulsar"
bike.call(obj2);  // "Pulsar"

Мне нужно объяснение, потому что я не могу его получить. Переопределяет ли функция вверху (то есть велосипед), когда я назначил ей исходный BikeFun. Как это работает? (Кстати, я копирую примеры, предоставленные только mdn) # javascript

1 Ответ

0 голосов
/ 11 апреля 2020

Позвольте мне шаг за шагом объяснить, что происходит в вашем фрагменте кода:

  1. Вы объявляете переменную bike и присваиваете ей ссылку на эту функцию:
function() {
  console.log(this.name);
}
Вы объявляете переменную originalBikeFun и присваиваете reference для функции, описанной выше. На данный момент у вас есть две переменные bike и originalBikeFun, которые указывают только на одну область памяти, в которой хранится ваша функция. Вы присваиваете ( разыменование ) переменной bike this новая функция:
function() {
  originalBikeFun.call(obj1);
}

В этот момент у вас есть переменная bike, указывающая на эту функцию:

function() {
  originalBikeFun.call(obj1);
}

и переменная originalBikeFun, указанная на ранее назначенную функцию:

function() {
  console.log(this.name);
}
При вызове функции bike выполняются следующие строки кода:
a) originalBikeFun.call(obj1);
b) console.log(this.name);

Таким образом, результатом этого вызова является "Pulsar".

Когда вы вызываете bike.call(obj2), разница между предыдущим вызовом функции заключается в том, что вы просто передаете obj2 как указатель this, но поскольку в функции bike у вас есть только один вызов с переназначением указателя this, то есть нет разницы.
...