вводить переменные в область действия функции - PullRequest
0 голосов
/ 18 февраля 2020

следующая функция берет объект и возвращает функцию. функция, которую она возвращает, является функцией более высокого порядка, которая принимает функцию обратного вызова.

const deconstruct = function (object) {
    const declarations = Object.entries(object).reduce(function (string, entry) {
        const key = entry[0];
        const value = entry[1];
        const declaration = "const " + key + " = " + value + ";";
        return string + declaration;
    }, "");
    const execute = function (callback) {
        return Function(
            declarations
            + "return "
            + callback.toString()
            + "();"
        )();
    };
    return execute;
};

execute увеличивает callback, делая ее частью новой функции. новая функция объявляет константы, запускает callback и возвращает результат. поскольку в новой функции объявленные константы и callback находятся в одной и той же области, callback может получить доступ к этим константам, тем самым эффективно вводя эти константы в область действия callback. Вот пример вызова deconstruct.

deconstruct({
    a: 0,
    b: 1,
    c: 2
})(function () {
    console.log(a, b, c); // 0 1 2
});

, но есть ли другой способ ввести переменные в область действия функции без использования промежуточных строк, как это делает мой код?

1 Ответ

0 голосов
/ 19 февраля 2020

Исходя из вашей пересмотренной информации в вопросе, теперь я вижу, что цель состояла в том, чтобы сохранить ее DRY (Не повторяйте себя). Цель состояла в том, чтобы избежать ненужного повторения (a, b, c), представляя, что может быть сотни свойств.

Вот одна из стратегий. Вы можете использовать оператор with, чтобы ввести this в область видимости и привязать объект к функции.

values = { a: 0, b: 1, c: 2 };

function foo() {
  with(this) {
    console.log(a,b,c);
  }
}

foo.apply(values);

// or

let bar = foo.bind(values);
bar();

Или для одноразового использования вы можете просто определить функцию со значениями в области:

values = { a: 0, b: 1, c: 2 };

with (values) foo = () => {
  console.log(a, b, c);
}

foo();
...