【问题标题】:How can I *unpack* an object into a function's scope?我怎样才能 *unpack* 一个对象到一个函数的范围内?
【发布时间】:2011-03-28 00:50:20
【问题描述】:

我有这个代码...

function a(options) {
    for (var item in options) {
       if ( ! options.hasOwnProperty(item)) {
          continue;
       }
       this[item] = options[item];
    }
}

a({ 'abc': 'def' });

jsFiddle.

虽然这会从对象中解包变量,但会将它们设置为全局范围(附加到window),因为在这种情况下thiswindow

所以在函数之后我可以做alert(abc),它会提醒def,这不好。

如何将变量的范围设置为函数?

【问题讨论】:

  • 我认为唯一的可能是使用with,但通常应该避免使用。
  • @Felix 谢谢,请发表答案:)
  • 就像 Felix 说的那样,你可以使用 with,但我有点好奇为什么你会费力地将对象解压到函数的作用域中。你不能只使用你传入的选项变量吗?
  • @Mrbuubuu 我在回答this question,这个概念让我很感兴趣。

标签: javascript scope


【解决方案1】:

如果你想把对象的属性放在函数的作用域中,你可以扩展作用域,使用with

function a(options) {
    with(options) {
        // properties of `options` are in the scope
        alert(abc);
    }
}

免责声明Make sure you read the documentation and about disadvantages of with。它应该被避免,也有点被弃用:

不推荐使用with,并且在ECMAScript 5 strict 模式下被禁止。推荐的替代方法是将要访问其属性的对象分配给临时变量。

所以问题是为什么不坚持options

【讨论】:

  • +1 谢谢菲利克斯,至于为什么,请参阅我对问题的评论 :)
  • @alex: 是的,不知何故我觉得它与这个问题有关(我之前读过它;))。
  • 对我来说,我总是使用options.optionA 模式:)
【解决方案2】:

您可以使用 callee 属性从内部访问函数:

function a(options) {
    var thiz = arguments.callee;
    for (var item in options) {
        if (!options.hasOwnProperty(item)) {
            continue;
        }
        thiz[item] = options[item];
    }
}

a({
    'abc': 'def'
});

alert(a.abc);

或者,您可以在调用时设置范围:

function a(options) {
    for (var item in options) {
        if (!options.hasOwnProperty(item)) {
            continue;
        }
        this[item] = options[item];
    }
}

a.call(a, {
    'abc': 'def'
});
alert(a.abc);

【讨论】:

  • 这并没有真正将属性添加到函数范围。它将它设置为函数对象的属性。
  • +1 谢谢,我打算尽量避免使用callee,因为它似乎已被弃用(我不确定是什么原因)。
  • 但也许这正是@alex 想要的 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多