我有这段代码......
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
,这是不好的。
如何将变量的范围设置为函数?
答案 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 5strict
模式下禁止使用options
。建议的替代方法是将要访问其属性的对象分配给临时变量。
所以问题是为什么不坚持{{1}}?