【发布时间】:2020-02-18 20:21:39
【问题描述】:
下面的函数接受一个对象并返回一个函数。它返回的函数是一个接受回调函数的高阶函数。
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
});
但是有没有其他方法可以将变量注入函数的范围,而无需像我的代码那样使用中间字符串?
【问题讨论】:
-
我想你的意思是
deconstruct(callback, ...outArgs) { return (function(inArgs) { callback(inArgs) })(outArgs); } -
请问您为什么要这样做?似乎很难弄清楚使用 this 时定义和未定义的变量。
-
我想知道为什么
({a, b, c}) => console.log(a, b, c)对你来说不够好。 -
@Khauri 我其实不知道。我只是在回答别人的问题,这就是我的回答。我只是想知道是否有任何方法可以改进它。这是原始问题的链接:reddit.com/r/learnjavascript/comments/f5mrnl/…
-
您的解决方案的问题在于,由于您本质上是在重新定义函数,并且函数的范围是在创建函数时确定的,因此您最终会失去原始函数的范围。您只维护全局范围和您定义的新范围。
标签: javascript variables scope