如何*将一个对象解包到一个函数的作用域中?
我有这样的代码......如何*将一个对象解包到一个函数的作用域中?
function a(options) {
for (var item in options) {
if (! options.hasOwnProperty(item)) {
continue;
}
this[item] = options[item];
}
}
a({ 'abc': 'def' });
虽然这从对象解包变量,它将它们设置为全局范围(附加到window
),因为this
是window
在这种情况下。
所以功能后我可以做alert(abc)
它会提示def
,这是不好的。
我将如何设置变量的作用域为函数?
如果你想放的属性在功能范围内的对象,可以使用扩展范围使用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中5strict
模式是被禁止的。建议的替代方法是将要访问其属性的对象分配给临时变量。
所以问题是为什么不坚持options
?
您可以使用被叫酒店需要从自身内部访问功能:
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);
这并没有真正将属性添加到函数作用域。它将它设置为函数对象的属性。 – 2011-03-28 01:00:58
+1谢谢,我正试着避免使用'callee',因为它似乎已被弃用(出于什么原因我不确定)。 – alex 2011-03-28 01:01:20
但也许这是@alex想要的;) – 2011-03-28 01:02:49
我认为唯一的可能性是使用'with',但通常应该避免。 – 2011-03-28 00:59:15
@Felix谢谢,请发表回答:) – alex 2011-03-28 01:02:23
可能重复的[Javascript局部变量声明](http://stackoverflow.com/questions/1119335/javascript-local-variable-declare) – Jon 2011-03-28 01:04:37