1

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

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

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

谢谢

4

2 回答 2

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

于 2013-03-28T11:12:49.167 回答
1

此页面对可用范围进行了很好的解释。

如果你足够努力,你会发现更多关于如果你不限定变量范围会发生什么的信息。它的要点是您的代码将成功运行,但效率较低。原因是 ColdFusion 将尝试找到正确的范围。它以指定的顺序检查某些范围。那个订单在哪里,我只是没能很快找到它。

对于你的第二个问题,

<cfset myVar = 10>

将 myVar 变量放入变量范围。

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

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

就个人而言,我将所有变量的范围都限定为变量范围。

于 2013-03-28T12:22:16.323 回答