开发者

How can I *unpack* an object into a function's scope?

开发者 https://www.devze.com 2023-02-19 23:01 出处:网络
I have this code... function a(options) { for (var item in options) { if ( ! options.hasOwnProperty(item)) {

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 5 strict 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);
0

精彩评论

暂无评论...
验证码 换一张
取 消