Могу ли я изменить область действия функции? Предотвратить его появление в области глобальных переменных - PullRequest
0 голосов
/ 29 сентября 2011

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

Проблема есть; скажем, у меня есть объявление функции в представлении (cfscript):

function myFunction(){
    //doStuff
}

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

Я пробовал:

function local.myFunction(){
    //doStuff
}
//error!

var myFunction = "";
function myFunction(){
    //doStuff
}
//just creates a local string and a global function...

var function myFunction(){
    //doStuff
}
//no error but function is still not local...

Следующее, однако, работает, хотя и выглядит немного противно ...

function myTMPFunction(){
    //doStuff
}
var myFunction = myTMPFunction;
structDelete(VARIABLES, "myTMPFunction");

нет ли лучшего, чистого пути?

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

нет лучшего, чистого пути?

Да, есть. Он называется ColdFusion компонентов он же CFC.

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

1 голос
/ 29 сентября 2011

Исходя из вашего комментария к записи Сергея,

его рекурсив для генерации HTML

Я бы сказал, может быть, вам следует преобразовать функцию в пользовательский тег.

Я обычно избегаю прямого вывода чего-либо из функций и вместо этого использую пользовательские теги. Когда я использую функции, я возвращаю некоторое значение (или недействительно).

Однако, без более конкретной информации о том, что делает функция, будет трудно дать более конкретный ответ, чем этот.

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

function myTMPFunction(){
    //doStuff
}
var myFunction = myTMPFunction;
structDelete(VARIABLES, "myTMPFunction");
0 голосов
/ 29 сентября 2011

Локальная область действия действительно важна только в контексте функции. Причина, по которой вы изменяете переменные области видимости в cfc, заключается в том, что переменные, которые должны быть локальными для функции, не просачиваются из области действия функции в компонент. Это становится особенно важным, если у вас есть постоянные компоненты, такие как сеанс или приложение.

component{

    public void function leakyVariable(){
            //this is in variables scope so a) it will exist longer 

            //than this function call and other functions can access it
        foo = "Foo"; 

        //do stuff
    }

    public void function grabLeakyVariable(){
            //look i have a foo
        var foobar = foo & "bar";
    }

}
...