【问题标题】:Adding JavaScript variables into local scope将 JavaScript 变量添加到本地范围
【发布时间】:2014-07-02 16:07:57
【问题描述】:

我想将一组变量作为函数的输入,然后定义它们以在该函数中使用。

例如:

var variables = {
    foo: 1,
    bar: 2,
};

function doSomething (scope) {
    makeLocal(scope); // I'd like something to do this

    return foo + bar;
}

doSomething(variables); // should return 3

这样的事情存在吗? PHP 有一个称为extract 的工具,我希望JavaScript 也存在类似的东西。我知道我可以向window 添加属性,但如果可能的话,我不希望污染我的全局命名空间。

【问题讨论】:

  • scope.foo + scope.bar 有什么问题?
  • @entropic 我计划有很多变量,并且要大量使用它们。如果可以的话,我宁愿不要到处都有“范围”(甚至是一个字符的变量名)
  • 在 JS 中没有原生方法。如果这可以使用一些丑陋的 eval() 技巧来完成,你必须在 doSomething() 中完成,否则新变量将在 makeLocal() 的范围内。

标签: javascript scope


【解决方案1】:

JavaScript 没有任何等效于 PHP 的提取物。一种接近的方法是在调用 makeLocal() 时绑定当前上下文并将变量分配给它:

Demo

var variables = {
    foo: 1,
    bar: 2,
};

function makeLocal(scope){
    for(var key in scope){
        this[key] = scope[key];   
    }
}

function doSomething (scope) {
    makeLocal.call(this, scope);

    return foo + bar;
}

这样做的缺点是如果doSomething() 没有上下文,它将是全局对象(浏览器中的窗口)并且您的变量会污染全局范围。

【讨论】:

  • 我可能说得太早了,这似乎在window 之外的任何情况下都不起作用。你能提供一个在其他环境中工作的例子吗?
  • 这仅在this 是全局上下文时才有效(window 大部分时间,除了例如在严格模式下)。在doSomething.call({}, scope)obj.doSomething(scope) 时不起作用;你需要使用return this.foo + this.bar;。但是当它起作用时,它当然会污染全局命名空间。
  • 是的,同意 - 它在全球范围之外不起作用。让它在任何范围内工作的唯一方法是让它存储window[key] = scope[key] 而不是this,但这总是使用全局变量。我不相信在 JavaScript 中有任何其他方法可以做到这一点。
【解决方案2】:

有一个很好的javascript库可以让你使用php函数,就像extract一样。

看看!

http://phpjs.org

这是您要查找的内容:

http://phpjs.org/functions/extract/

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2015-12-25
    • 2020-02-07
    相关资源
    最近更新 更多