如何*将对象解压缩到函数的范围内?

时间:2011-03-28 00:50:20

标签: javascript scope

我有这段代码......

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,这是不好的。

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

2 个答案:

答案 0 :(得分: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 :(得分:2)

如果要将对象的属性放在函数的范围内,可以使用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}}?