我可以改变范围功能吗?防止它出现在全局变量范围内

时间:2011-09-29 09:09:11

标签: function coldfusion scope

我正在清理一个大型网站的巨大变量范围,通常在清理这些内容时,我会发现变量和变量范围。

问题是;说我在视图中有一个函数声明(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 个答案:

答案 0 :(得分:2)

  

有没有更好,干净的方式?

是的,有。它被称为ColdFusion components又名CFC。

我怀疑你错误地使用了本地范围概念,但是你没有说明你的代码是否在CFC中,所以我只能猜测:如果你在重构CFC,你想要的是封装,否则你只想在方法中开始使用组件和然后本地范围。

答案 1 :(得分:1)

根据您对Sergii帖子的评论,

  

用于递归生成HTML

我想说也许你应该将函数重构为自定义标记。

我通常避免直接从函数输出任何内容,而是使用自定义标签。当我使用函数时,我返回某个值(或无效)。

如果没有关于该功能的更多具体信息,那么很难给出比这更具体的答案。

然而,虽然不是最漂亮的,但我认为如果您不打算使用自定义标记,那么您的解决方案也会有效。

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

答案 2 :(得分:0)

本地范围仅在函数的上下文中非常重要。在cfc中使用var范围变量的原因是,应该是函数本地的变量不会从函数的范围泄漏到组件中。如果您在持久范围(如会话或应用程序)中拥有组件,这一点就变得尤为重要

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";
    }

}