我一直在阅读有关CF范围的内容,并且对CFC范围及其含义(detailed here)感到满意,但是,每当我搜索CF范围时,它几乎总是在CFC的上下文中引用 - 所以我希望对CFM页面中的范围做一些澄清。我正在使用CF 9/10,因此只对范围在这些版本中的行为感兴趣。
CFM页面上有哪些可用范围 - CFM页面是否具有与其他地方相同的并发问题,或者是绑定到该特定请求范围的CFM页面上的变量?
如果我在CFM页面中包含行<cfset myVar = 10 />
,它将包含在哪个范围内?是否存在访问变量的其他用户或访问变量的其他cfm页面的风险?
由于
答案 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的后续版本中,有一个本地范围可以完成同样的事情。
就个人而言,除了变量范围之外,我将调整所有变量的范围。