范围所有的东西!
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
变得相同时,只要您还“范围”并将这些私有变量引用为local.a
,就可以删除var local = structNew()
的所有实例。
底线
的是,有一些性能开销,如果CF具有查找每个请求变量的作用域。如果您使用searchImplicitScopes=false
关闭了查找,则应该会提高性能。但是,那应该真的取决于您的应用程序和平均请求负载。
对不起 - 我没有看到你的答案是特定于版本的。 –