Coldfusion范围澄清

时间:2013-03-28 10:44:53

标签: coldfusion scope coldfusion-9

我一直在阅读有关CF范围的内容,并且对CFC范围及其含义(detailed here)感到满意,但是,每当我搜索CF范围时,它几乎总是在CFC的上下文中引用 - 所以我希望对CFM页面中的范围做一些澄清。我正在使用CF 9/10,因此只对范围在这些版本中的行为感兴趣。

  1. CFM页面上有哪些可用范围 - CFM页面是否具有与其他地方相同的并发问题,或者是绑定到该特定请求范围的CFM页面上的变量?

  2. 如果我在CFM页面中包含行<cfset myVar = 10 />,它将包含在哪个范围内?是否存在访问变量的其他用户或访问变量的其他cfm页面的风险?

  3. 由于

2 个答案:

答案 0 :(得分:2)

几乎所有范围除了'THIS'都可以在CFM页面中找到。

在CFM页面中声明的未范围变量可以直接调用,也可以使用VARIABLES范围前缀调用。

例如:

<cfset varA = 'someValue'/>

也可以写成

<cfset VARIABLES.varA = 'something' />

据我所知,除非您创建一个单例(仅适用于CFC)并将其放在应用程序范围内,否则您永远不会冒险与其他用户共享变量。如果不小心在CFC函数中正确定义局部变量,这也是有效的。

在CFM页面上,每个用户请求都有自己的处理线程,永远不会与其他用户请求交叉。因此,变量仅绑定到该特定请求的范围。

如果您希望所有请求页面的用户都使用变量,您可以将其放在APPLICATION范围内。

我不太明白你的第二个问题。如果你可以详细说明,我可以在我的答案中添加更多内容。

<强>更新

此代码将帮助您回答2个问题。

<cfscript>
    function a(){
        _a = 20;
        WriteOutput("Inside function:"&variables['_a']);
        WriteOutput("Inside function:"&variables['_b']);
    }
    _b = 30;
    a();
    WriteOutput('outside function:'&variables['_a']);
</cfscript>

输出

  

内部功能:20内部功能:30外部功能:20

答案 1 :(得分:1)

This page,对可用范围给出了很好的解释。

如果你看起来足够努力,你会发现更多信息,如果你没有调整变量的范围,会发生什么。它的要点是您的代码将成功运行,但效率较低。原因是ColdFusion将尝试找到正确的范围。它按指定的顺序检查某些范围。那个顺序很糟糕,我很快就找不到了。

关于第二个问题,

<cfset myVar = 10>

将myVar变量放入变量范围。

关于一个用户更改影响其他用户的变量,我认为唯一存在风险的范围是应用程序范围。但是,对于现代浏览器,单个用户可能会弄​​乱自己的会话变量。我已经看完了。

变量可能无意中改变的另一种方式是使用函数。如果要将变量保持在函数的本地,则必须在实例化时使用var关键字。在CF的后续版本中,有一个本地范围可以完成同样的事情。

就个人而言,除了变量范围之外,我将调整所有变量的范围。