如何*将一个对象解包到一个函数的作用域中?

问题描述:

我有这样的代码......如何*将一个对象解包到一个函数的作用域中?

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

我将如何设置变量的作用域为函数?

+0

我认为唯一的可能性是使用'with',但通常应该避免。 – 2011-03-28 00:59:15

+0

@Felix谢谢,请发表回答:) – alex 2011-03-28 01:02:23

+0

可能重复的[Javascript局部变量声明](http://stackoverflow.com/questions/1119335/javascript-local-variable-declare) – Jon 2011-03-28 01:04:37

如果你想放的属性在功能范围内的对象,可以使用扩展范围使用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

+0

+1谢谢菲利克斯,至于为什么,请参阅我对该问题的评论:) – alex 2011-03-28 01:15:27

+0

@alex:是的,不知何故,我感觉它与这个问题有关(我读过它更早;))。 – 2011-03-28 01:16:57

+0

至于我,我总是会使用'options.optionA'模式:) – alex 2011-03-28 01:26:13

您可以使用被叫酒店需要从自身内部访问功能:

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); 
+0

这并没有真正将属性添加到函数作用域。它将它设置为函数对象的属性。 – 2011-03-28 01:00:58

+0

+1谢谢,我正试着避免使用'callee',因为它似乎已被弃用(出于什么原因我不确定)。 – alex 2011-03-28 01:01:20

+0

但也许这是@alex想要的;) – 2011-03-28 01:02:49