Как этот объект JavaScript имеет ссылку на эту встроенную функцию? - PullRequest
0 голосов
/ 25 августа 2018
var ninja = {
    chirp: function signal(n) {
    return n > 1 ? signal(n - 1) + "-chirp" : "chirp";
    }
};
assert(ninja.chirp(3) == "chirp-chirp-chirp", "Works as we would expect it to!");
var samurai = { chirp: ninja.chirp };
ninja = {};
assert(samurai.chirp(3) == "chirp-chirp-chirp","The method correctly calls itself.");

Сравните это с

var ninja = {
    chirp: function(n) {
    return n > 1 ? signal(n - 1) + "-chirp" : "chirp";
    }
};
assert(ninja.chirp(3) == "chirp-chirp-chirp", "does not work");
var samurai = { chirp: ninja.chirp };
ninja = {};
assert(samurai.chirp(3) == "chirp-chirp-chirp","The method cannot reference function.");

Как samurai имеет ссылку на свойство chirp в объекте ninja после того, как объект ninja был переопределен в ninja = {};?

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Функции могут существовать независимо от объектов, и наоборот. Думайте о функции signal и свойстве ninja.chirp как о двух отдельных сущностях, находящихся в памяти программы. ninja.chirp это просто указатель на signal. Когда вы присваиваете samurai.chirp для ninja.chirp, вы создаете еще один указатель на функцию signal. Уничтожение ninja.chirp не уничтожает signal, по крайней мере, до тех пор, пока на него ссылается что-то другое, в данном случае это samurai.chirp. Кроме того, это также будет работать для анонимной функции, если она не является рекурсивной, пример ниже:

var ninja = {
  chirp: function (n) {
    return console.log("chirp "+n+" times!");
  }
};

ninja.chirp(3);
var samurai = { chirp: ninja.chirp };

ninja = {};
samurai.chirp(3);
0 голосов
/ 25 августа 2018

Свойство chirp объекта ninja ссылается на функцию где-то в памяти (с именем signal.) Объект ninja в основном содержит «дистанционное управление» этой функцией.Этот «пульт дистанционного управления» называется chirp.Когда вы создали объект samurai, вы создали еще один «пульт ДУ», который ссылался на функцию signal.

Функция будет существовать в памяти, пока на нее указывают «пульты ДУ».

0 голосов
/ 25 августа 2018

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

Таким образом, ninja = {} не меняет объект, которым изначально был ninja. Поскольку samurai имеет ссылку на ninja.chirp, функция ninja.chirp не будет собирать мусор - или, по крайней мере, пока, пока samurai еще существует.

Функция chirp или signal может вызывать себя с помощью signal(n - 1), потому что это именованная функция - она ​​называется signal, поэтому она может ссылаться и вызывать себя, используя свое имя функции. У анонимных функций нет имен, и поэтому они не могут ссылаться на себя таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...