Javascript функция изменения переменных области видимости - PullRequest
4 голосов
/ 11 сентября 2010

Я пытаюсь объявить функцию вне анонимной функции, но все еще имею доступ ко всем переменным анонимных функций

Ниже показано, о чем я говорю.

Мне просто нужно избавиться от eval.

//Used to determine where the variable is being stored
var variableScope = "global";

(function(window){
        var variableScope = 'insideFunction',
        appearingToBeGlobalFunction = function(){
                alert("This Function appears Global but really isn't");
        };
        window["addFunction"]=function(funName,fun){
                //window[funName] = fun;  Doesn't work
                eval("window[funName]="+fun+";");
        }
})(window);

addFunction("alertTest",function(){
        alert(variableScope);
        appearingToBeGlobalFunction();
});

//should alert "insideFunction" and "This Function appears Global but really isn't"
alertTest();

Редактировать: Цель этого вопроса состояла в том, чтобы в конечном итоге сохранить глобальную область действия чистой от множества переменных, но при этом иметь удобство доступа, установки и вызова, как если бы они были глобальными. Я пришел к выводу, что есть способ сделать то, что мне нужно, но это требует устаревшей функциональности в javascript. Вот пример кода, показывающего, как выполнить вышеупомянутое без eval. В этой статье обсуждается, как использовать «с».

var variableScope = "global";

var customScope = {
        variableScope : 'insideFunction',
        appearingToBeGlobalFunction : function(){
                alert("This Function appears Global but really isn't");
        }
};

function alertTest(){
        with(customScope){
             alert(variableScope);
             appearingToBeGlobalFunction();
        }
};

//should alert "insideFunction" and "This Function appears Global but really isn't"
alertTest();​

Ответы [ 4 ]

2 голосов
/ 11 сентября 2010
eval("window[funName]="+fun+";");

О, Господи.

Причина, по которой это «работает», заключается в том, что вы конвертируете функцию fun (alertTest) в строку, чтобы поместить ее в аргумент eval.

Бывает, что в большинстве браузеров для настольных компьютеров результатом toString() нативной функции JS будет строка, которая выглядит как выражение функции, содержащее тот же код, что и исходное объявление.Вы превращаете функцию обратно в строку и повторно анализируете эту строку в контексте новой включающей функции, поэтому новое значение функции - это тот же код, но с другим замыканием.

Однако этоне требуется, чтобы Function#toString работал так, а в некоторых случаях не будет .Не безопасно полагаться на разложение функций;избегайте.

Конечно, вы можете совершать ужасные хакерские атаки только с использованием eval, хотя нет никаких причин, по которым часть window[funName]= должна находиться внутри eval.window[funName]= eval('('+fun+')'); будет работать одинаково хорошо (плохо).

Я пытаюсь объявить функцию вне анонимной функции, но все еще имею доступ ко всем переменным анонимных функций

Зачем тебе делать что-то сумасшедшее?

2 голосов
/ 11 сентября 2010

Вы не можете избавиться от eval и все же ожидать, что он сработает. Это единственный способ взглянуть на членов прицела после того, как он был «закрыт». В прошлом я возился с чем-то похожим , но я бы никогда нигде не использовал его. Рассмотрите альтернативное решение для всего, что вы пытаетесь достичь.

0 голосов
/ 24 октября 2010

Цель этого вопроса состояла в том, чтобы в конечном итоге сохранить глобальную область действия чистой от множества переменных, но при этом иметь удобство доступа, установки и вызова, как если бы они были глобальными.Я пришел к выводу, что есть способ сделать то, что мне нужно, но это требует устаревшей функциональности в javascript.Вот пример кода, показывающего, как выполнить вышеупомянутое без eval. В этой статье обсуждается, как использовать «с».

var variableScope = "global";

var customScope = {
        variableScope : 'insideFunction',
        appearingToBeGlobalFunction : function(){
                alert("This Function appears Global but really isn't");
        }
};

function alertTest(){
        with(customScope){
             alert(variableScope);
             appearingToBeGlobalFunction();
        }
};

//should alert "insideFunction" and "This Function appears Global but really isn't"
alertTest();​
0 голосов
/ 11 сентября 2010

вы можете заставить переменные находиться в глобальной области видимости, например, вместо var variableScope = 'insideFunction' вы используете window.variableScope = 'insideFunction'

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