Javascript функции, возвращающие функцию - PullRequest
0 голосов
/ 07 апреля 2020

Обучается javascript, и у него есть пара вопросов по приведенному ниже коду

const o = {
    f (v){
        function c(p){
            console.log(p)
        }
        return c
    }
}

f1 = o.f()
f2 = o.f()

Вопросы

1) f1 and f2 различаются clones of c(p)

подобно f1 and f2, каждый из которых указывает на уникальное пространство памяти, где c(p) код копируется

2) или f1 and f2 указывает на то же пространство памяти, что и c(p)

3) также является ли приведенный выше код сценарием закрытия?

, где o.f имеет закрытие на c(p), и даже после того, как o.f стек выполнения пропал, у нас есть ссылка на c(p) в форме f1 and f2

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

1) получает ли f1 и f2 разные клоны c (p)

Это правильно. Каждый вызов o.f() создает совершенно новый function c(p). Это очень легко показать, я немного изменю ваш код:

const o = {
    f (v){
        function c(p){
            console.log(p)
        }
        return c
    }
}

f1 = o.f()
f2 = o.f()

console.log(f1 === f2);

Итак, мы ясно видим, что f1 и f2 различны, поэтому возвращаемая функция не совпадает. Просто для ясности, объекты в JavaScript равны, только если они являются тем же объектом, а не просто похожи по форме и содержанию. И функции также являются объектами, таким образом:

const a = function f() {
  return 2 + 2;
};

const b = function f() {
  return 2 + 2;
};

const c = a;

console.log("a === b", a === b); //false
console.log("b === c", b === c); //false
console.log("a === c", a === c); //true

2) или f1 и f2 указывают на то же пространство памяти, что и c (p)

Ну, определенно нет. Я показал это выше - функции разные.

3) также является ли приведенный выше код сценарием закрытия?

Э, да, но ... это действительно не имеет значения Закрытие создается каждый раз, когда создается функция . Итак, есть один для o.f(), а затем один создается с c() каждый раз, когда вызывается o.f().

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

Ваша интуиция верна.

Проведите некоторое исследование JavaScript (и вообще) субъекта "замыканий".

Я думаю, что это самое близкое к «чистая магия», которую мы видим в нашем мире программирования. И иногда очень полезно.

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