范围所有的东西!
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
,您应该会获得一些性能提升。但是,这实际上应该取决于您的应用程序和平均请求负载。