I have this code...
function a(options) {
for (var item in options) {
if ( ! options.hasOwnProperty(item)) {
continue;
}
this[item] = options[item];
}
}
a({ 'abc': 'def' });
jsFiddle.
Whilst this unpacks variables from the object, it sets them to global scope (attached to window
) because this
is window
in that circumstance.
So after the function I can do alert(abc)
and it will alert def
, which isn't good.
How would I set the s开发者_开发技巧cope of the variables to the function?
If you want to put the properties of the object in the scope of the function, you can extend the scope by using with
:
function a(options) {
with(options) {
// properties of `options` are in the scope
alert(abc);
}
}
Disclaimer: Make sure you read the documentation and about disadvantages of with
. It should be avoided and is also kind of deprecated:
Using
with
is not recommended, and is forbidden in ECMAScript 5strict
mode. The recommended alternative is to assign the object whose properties you want to access to a temporary variable.
So the questions is why not stick with options
?
You can access the function from inside itself using the callee property:
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);
Alternatively, you can set the scope when you call it:
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);
精彩评论