Подтвердить что ты не робот

JavaScript: ссылка на функцию local scope как объект

Когда я вызываю функцию, для этого вызова создается локальная область. Есть ли способ напрямую ссылаться на эту область как объект? Точно так же, как окно является ссылкой для объекта глобальной области видимости.

Пример:

function test(foo){
    var bar=1
    //Now, can I access the object containing foo, bar, arguments and anything
    //else within the local scope like this:
    magicIdentifier.bar
}

В качестве альтернативы, у кого-нибудь есть полный список того, что находится в локальной области поверх пользовательских переменных?

Справочная информация. Я пытаюсь перейти к способу полного перехода в глобальную область действия из вызова функции, оператор with - это шутка, вызов работает немного лучше, но он все равно прерывается для всего, что объявлено в области функций но не в глобальном масштабе, поэтому я бы объявил эти несколько случаев в глобальном масштабе, но это требует, чтобы я знал, что это такое. IE-функция execScript делает полный сдвиг, но это только решает проблему для IE.

Примечание. Для любого пользователя, загружающего JavaScript динамически, setTimeout(code,1) - это простой эффективный взлом для достижения глобальной области действия, но он не будет выполняться немедленно.

4b9b3361

Ответ 1

Нет, нет способа ссылаться на объект переменной контекста выполнения функции объекта привязки переменной среды контекста выполнения (что то, что эта вещь называется [now, следовательно, зачеркивание ], подробности в §10.3 спецификации). Вы можете получить доступ только к ограниченному виду, которое вы получите с помощью arguments (что очень ограничено).

Обычно, когда я хотел сделать это, я просто поместил все, что захотел, на объект, а затем использовал это (например, передал его в функцию). Конечно, любые функции, созданные в контексте, имеют доступ ко всему в области, где они созданы, поскольку они "закрывают" контекст; подробнее: Закрытие не сложно.

Ответ 2

Я знаю, что это очень поздно, и вы, вероятно, даже немного не заинтересованы, но меня тоже интересовала возможность его реализации, и вы могли бы сделать какую-то работу, используя:

(function(global) {
    var testVar = 1;

    global.scope = function(s) {
        return eval(s);
    }
})(this);

затем выполните:

scope('testVar'); // 1

возвращает переменную из замыкания. Не особенно приятно, но теоретически можно обернуть это в объект, возможно, используя некоторые валидации, геттеры и сеттеры, если вам нужно?

Изменить. Перечитав вопрос, я предполагаю, что вы захотите получить к нему доступ, не указывая функцию в самой области, поэтому это, вероятно, неприменимо. Я все равно оставлю это здесь.

Ответ 3

Некоторые версии Netscape имели свойство magic в объекте arguments, которое делало то, что вы искали. (Я не помню, как это называлось)

Ответ 4

Как насчет этого?

<script type="text/javascript">
    var test =  {
        bar : 1,
        foo : function () {
            alert(this.bar);
        }
    }

    test.foo();
</script>

Ответ 5

если вы хотите перенести область действия на любой объект, вы можете использовать библиотеку подчёркивания с помощью _.bind

В вашем случае:

var fn = _.bind(function(){
    console.log(this == window)
},window)

fn() // true

Ответ 6

Вам не нужно использовать ключевое слово для ссылки на переменную в локальной области, потому что это область, в которой вы находитесь.