2016-03-04 21 views
2

需要做些什么,采取从ColdFusion 2016's new setting searchImplicitScopes="false"的性能增益的优势:变量&这是否考虑CF2016中的CFC内的隐式范围?

... bypasses searching for a variable in the implicit scopes thus finding the variables defined in the application faster.

我们应该开始ColdFusion的2016作用域Variables & This一个范围内的CFC与searchImplicitScopes="false"

我无法找到有关CF2016中隐式作用域的任何文档。我很确定localarguments示波器在功能内部没有问题,但在CFC中经常使用的示波器如variablesthis

+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. foovariables范围内,你会得到一个错误:Element FOO is undefined in TEST.
  2. bar是在this范围,所以你得到的输出test.bar
  3. narf是在variables范围内,你会得到一个错误: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 = 0local.a = 0变得相同时,只要您还“范围”并将这些私有变量引用为local.a,就可以删除var local = structNew()的所有实例。

底线

的是,有一些性能开销,如果CF具有查找每个请求变量的作用域。如果您使用searchImplicitScopes=false关闭了查找,则应该会提高性能。但是,那应该真的取决于您的应用程序和平均请求负载。

+0

范围所有的东西?甚至是'local'和'arguments'?对不起,我刚刚重新说明了我的问题,明确指出我在问怎么才能充分利用CF2016的searchImplicitScopes = false的性能增益。 – Henry

+1

范围每一件事。甚至'本地'和'参数' –

+0

@AdrianJMoreno“我会说,是的”你能证实吗?我没有安装CF2016。明天我会发现我的答案。 – Henry

0

刚安装CF 2016 Express和我可以断定,与searchImplicitScopes="false"Variables范围仍在搜索时变量未作用域,但不是This范围。