【问题标题】:inject variables into the scope of a function将变量注入函数范围
【发布时间】: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


【解决方案1】:

根据您在问题中修改后的信息,我现在看到目的是保持干燥(不要重复自己)。目标是避免不必要地重复 (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();

【讨论】:

  • 谢谢!这比我的解决方案要好。虽然我没有使用 with ,因为原始问题的 OP 说他们希望看到没有它的版本,但我想没有它我也无能为力。无论如何,他们的问题与其说是一个实际问题,不如说是一个思考练习。我想这是可以做到的。选择了你的答案!非常感谢您的帮助?
猜你喜欢
  • 2012-01-27
  • 2011-05-05
  • 2015-12-26
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
相关资源
最近更新 更多