是变量&这考虑了CF2016中CFC内部的隐含范围?

时间:2016-03-04 19:07:51

标签: coldfusion scope cfml coldfusion-2016

利用ColdFusion 2016's new setting searchImplicitScopes="false"的性能增益需要做些什么:

  

...绕过在隐式作用域中搜索变量   更快地找到应用程序中定义的变量。

我们应该开始确定范围Variables& 2016年ColdFusion中具有This的CFC中的searchImplicitScopes="false"范围?

我找不到任何有关CF2016中隐含范围的文档。我非常确定localarguments范围在函数中很好,但是在CFC中经常使用的范围如variablesthis呢?

2 个答案:

答案 0 :(得分:3)

范围所有的事情!!!

CFC中的variables范围对于CFC内的所有函数都是全局的。

CFC中的this范围对于CFC内的所有函数都是全局的,也可以从CFC的调用者中引用。

如果未在CFC中对变量进行范围调整,则默认为variables范围。

<--- this_test.cfc --->
<cfcomponent>
    <cfset variables.foo = "This is my CFC global variable." />
    <cfset this.bar = "This variable is global to my CFC and can be referenced externally." />
    <cfset narf = "Global variable! Point!" />
    <cffunction name="getNarf" access="public">
        <cfreturn narf />
    </cffunction>
</cfcomponent>

测试电话:

<cfset test = new this_test() />

<cfoutput> <li>#test.foo#</li> <li>#test.bar#</li> <li>#test.narf#</li> <li>#test.getNarf()#</li> </cfoutput>

  1. foo位于variables范围内,您将收到错误消息:Element FOO is undefined in TEST.
  2. bar位于this范围内,因此您可以获得test.bar的输出。
  3. narf位于variables范围内,您将收到错误消息:Element NARF is undefined in TEST.
  4. 获取narf值的唯一方法是让函数返回它。
  5. <强>更新

    searchImplicitScopes可以关闭CF的范围搜索功能。因此,如果您没有限定某些内容,它就不会查找范围的层次结构。问题是,默认情况下,无范围的变量是否会在variables范围内结束?我会说,是的,因为这是CFC首次亮相后的默认值。

    无论使用哪种设置,我仍然说范围一切。他们创建隐式local范围的原因是:

    1. 开发人员不习惯var范围函数局部变量
    2. 开发人员往往会var local = structNew(),因此他们只需要var范围内的一个变量。
    3. 2还使他们能够返回函数局部变量的集合。
    4. 从CF 9开始,当var a = 0local.a = 0变为相同时,您可以删除var local = structNew()的所有实例,只要您还有&#34;范围&#34;并将这些私有变量引用为local.a
    5. 底线

      如果CF必须在每个请求上查找变量范围,那么会产生一些性能开销。如果您使用searchImplicitScopes=false关闭了该查找,则应该会获得一些性能提升。但是,那应该真正依赖于您的应用程序和平均请求负载。

答案 1 :(得分:0)

刚刚安装了CF 2016 Express,我可以得出结论@Html.LabelFor(model => model.Tier),当变量没有范围但是searchImplicitScopes="false"范围时,仍在搜索Variables范围。