[英]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.