Снеси замыкание в JavaScript - PullRequest
1 голос
/ 20 сентября 2010

Есть ли способ разрушить замыкание в JavaScript, чтобы определить, что это за функция и какова область действия?

Или, возможно, более кратко, есть ли способ сериализации замыкания в JavaScript?1003 *

edit

Что мне интересно, если мне дана функция, объявленная следующим образом:

var o = {};
var f = function() { return o; }

Есть ли способ посмотреть толькои найти о?

Ответы [ 2 ]

3 голосов
/ 20 сентября 2010

Я не уверен, что вы подразумеваете под "снести замыкание".Определить, что это за функция, можно, используя arguments.callee :

function test () { console.log(arguments.callee); }
// -> function test () { console.log(arguments.callee); }

и какова область действия?

Единственный реальный способпроверить, находится ли переменная в области видимости, пытаясь получить к ней доступ.Это означает, что вам нужно использовать оператор try / catch, потому что выдается ошибка, если вы ссылаетесь на необъявленную переменную:

try{ myVar; alert("myVar is in scope"); }catch (e){ alert("myVar is not in scope"); }

Реально вы бы уже знали, какие переменные находятся в области видимости, если бы написали код илидаже проверяя код, если вы его не написали.

Если вы пытаетесь получить стек, вы можете (вроде) сделать это, используя свойство caller , но оно нестандартно и может быть доступно не во всехРеализации JS *:

function getStack () {
    var stack = [], cFunc = arguments.callee;
    while (cFunc = cFunc.caller)
        stack.push(cFunc);

    console.dir(stack);
}

function func1 () { func2(); }
function func2 () { try { obviousError(); } catch (e) { getStack(); } }

Большинство встроенных инструментов разработчика дают вам стек (в IE 7 и IE 8 нет) гораздо понятнее, поэтомуЛучше всего использовать их, где это возможно.

* В настоящее время все основные браузеры поддерживают Function.caller.Также кажется, что это определено в ECMAScript 3.1 - вы можете проверить поддержку здесь .

1 голос
/ 21 сентября 2010

Если я вас правильно понимаю (трудно сказать, даже с вашим последним редактированием), ответ - нет. Одна из целей замыканий - инкапсулировать переменные, ограничивая доступ к группам связанного / зависимого кода (назначенного из глобального контекста), чтобы минимизировать конфликты имен и / или случайное взаимодействие. Если вы хотите получить доступ к o в глобальном контексте, вам следует вместо этого определить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...