Как я могу * распаковать * объект в область действия функции? - PullRequest
4 голосов
/ 28 марта 2011

У меня есть этот код ...

function a(options) {
    for (var item in options) {
       if ( ! options.hasOwnProperty(item)) {
          continue;
       }
       this[item] = options[item];
    }
}

a({ 'abc': 'def' });

jsFiddle .

Несмотря на то, что это распаковывает переменные из объекта, он устанавливает их в глобальную область (прикрепленную к window), потому что this равно window в этом случае.

Итак, после функции я могу выполнить alert(abc), и она выдаст предупреждение def, что нехорошо.

Как бы я установил область видимости переменных для функции?

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Если вы хотите поместить свойства объекта в область действия функции, вы можете расширить область действия , используя with:

function a(options) {
    with(options) {
        // properties of `options` are in the scope
        alert(abc);
    }
}

Отказ от ответственности : Обязательно прочитайте документацию и ознакомьтесь с недостатками with. Этого следует избегать, и он также не рекомендуется:

Использование with не рекомендуется и запрещено в режиме ECMAScript 5 strict. Рекомендуемая альтернатива - назначить объект, свойства которого вы хотите получить доступ к временной переменной.

Так что вопрос в том, почему бы не придерживаться options?

2 голосов
/ 28 марта 2011

Вы можете получить доступ к функции изнутри, используя свойство 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...