3

如何利用ColdFusion 2016 的新设置searchImplicitScopes="false"带来的性能提升:

...绕过在隐式范围内搜索变量,从而更快地找到应用程序中定义的变量。

我们是否应该在 ColdFusion 2016 中开始在 CFC中确定范围Variables和范围?ThissearchImplicitScopes="false"

我找不到任何关于 CF2016 中被视为隐式范围的文档。我很确定local,作用域在函数内部很好,arguments但是在 CFC 中经常使用的作用域呢?variablesthis

4

2 回答 2

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. foovariables范围内,你会得到一个错误:Element FOO is undefined in TEST.
  2. barthis范围内,因此您将获得test.bar.
  3. narfvariables范围内,你会得到一个错误:Element NARF is undefined in TEST.
  4. 获取 的值的唯一方法narf是让函数返回它。

更新

searchImplicitScopes可能会关闭 CF 的范围搜索功能。因此,如果您不对某些内容设置范围,它就不会查找范围的层次结构。variables问题是,默认情况下,非作用域变量最终会出现在作用域中吗?我会说,是的,因为这是自 CFC 首次亮相以来的默认设置。

不管使用那个设置,我仍然说范围一切。他们创建隐式local作用域的全部原因是:

  1. 开发人员不习惯var定义函数局部变量
  2. 开发人员倾向于这样做var local = structNew(),因此他们只需要var限定一个变量。
  3. 2 还使他们能够返回函数局部变量的集合。
  4. 从 CF 9 开始,当var a = 0与 相同时local.a = 0,您可以删除 的所有实例var local = structNew(),只要您还“限定”范围并将这些私有变量引用为local.a.

底线

如果 CF 必须在每个请求上查找变量范围,就会有一些性能开销。如果您使用 关闭该查找searchImplicitScopes=false,您应该会获得一些性能提升。但是,这实际上应该取决于您的应用程序和平均请求负载。

于 2016-03-04T19:39:00.800 回答
1

刚刚安装了 CF 2016 Express,我可以得出结论,当变量没有作用域而不是作用域时searchImplicitScopes="false"Variables作用域仍在被搜索This

于 2016-03-04T23:44:15.743 回答