簡體   English   中英

將變量注入到函數的作用域中

[英]inject variables into the scope of a function

以下函數接受一個對象並返回一個函數。 它返回的函數是一個帶有回調函數的高階函數。

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
});

但是有沒有一種不同的方法可以將變量注入到函數的作用域中,而不像我的代碼那樣使用中間字符串?

根據您在問題中修改后的信息,我現在看到目的是保持干燥(不要重復自己)。 目標是避免不必要地重復 (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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM