充分利用ColdFusion 2016's new setting searchImplicitScopes="false"
带来的性能提升,需要做什么:
...从而在隐式范围内搜索变量
更快地找到应用程序中定义的变量。
我们应该在ColdFusion 2016中使用Variables
开始在CFC中对This
和searchImplicitScopes="false"
范围进行作用域设置吗?
我找不到关于CF2016中隐式作用域的任何文档。我很确定local
和arguments
范围在函数中可以使用,但是CFC中常用的范围,例如variables
和this
呢?
最佳答案
范围所有的东西!
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>
foo
在variables
范围内,会出现错误:Element FOO is undefined in TEST.
bar
在this
范围内,因此您将获得test.bar
的输出。narf
在variables
范围内,会出现错误:Element NARF is undefined in TEST.
获取
narf
值的唯一方法是让函数返回它。更新资料
searchImplicitScopes
可以关闭CF的范围搜索功能。因此,如果您不对范围进行限定,它将不会查找范围的层次结构。问题是,默认情况下,无作用域的变量是否最终会出现在variables
范围内?我会说,是的,因为自从CFC首次亮相以来,这就是默认值。不管使用哪种设置,我仍然会说出一切。他们创建隐式
local
范围的全部原因是:开发人员不习惯对函数局部变量进行
var
范围界定开发人员倾向于做
var local = structNew()
,因此他们只需要var
限定一个变量的范围。2还使他们能够返回函数局部变量的集合。
从CF 9开始,当
var a = 0
与local.a = 0
相同时,您可以删除var local = structNew()
的所有实例,只要您还“限定范围”并将那些私有变量引用为local.a
。底线
如果CF必须在每个请求中查找变量作用域,则会带来一些性能开销。如果使用
searchImplicitScopes=false
关闭该查找,则应该会提高性能。但是,那实际上应该取决于您的应用程序和平均请求负载。