冷融论的奇怪行为在外部功能中幸存?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冷融论的奇怪行为在外部功能中幸存?相关的知识,希望对你有一定的参考价值。
我已经将ColdFusion编程了超过15年,但从未遇到过这种情况。这是复制行为的代码:
<cfset _run()>
<cffunction name="_run">
<cfset variables.dataArray=ArrayNew(1)>
<cfset local.data={
area="profile"
}>
<cfset _append(data=local.data,field="name")>
<cfset _append(data=local.data,field="phone")>
<cfdump var="#variables.dataArray#" label="dataArray">
</cffunction>
<cffunction name="_append">
<cfargument name="data" type="struct" required="yes">
<cfargument name="field" type="string" required="yes">
<cfdump var="#arguments#" label="arguments">
<cfset arguments.data.field=arguments.field>
<cfset ArrayAppend(variables.dataArray,arguments.data)>
</cffunction>
正如您所看到的,这就是我所做的:
- 邀请数组进入变量范围以使其可全局访问
- 在本地范围内引用struct(local.data)
- 通过向_append函数调用数据来追加第一个字段项(名称)
- 以相同方式添加第二个字段项(电话)
此代码将导致以下输出:
正如您所看到的,当您可能期望第一个索引应该具有field =“name”时,代码会生成具有重复条目的数组。正如您所看到的,第二次调用_append的数据值包含属性“field”,其值为“name”。从第一次调用函数开始,它似乎停留在参数范围内?这怎么可能。我认为参数范围被隔离到cffunction标签内?
但是,如果我用这个替换_append函数:
<cffunction name="_append">
<cfargument name="data" type="struct" required="yes">
<cfargument name="field" type="string" required="yes">
<cfdump var="#arguments#" label="arguments">
<cfset local.data=Duplicate(arguments.data)>
<cfset local.data.field=arguments.field>
<cfset ArrayAppend(variables.dataArray,local.data)>
</cffunction>
它会给出以下输出:
正如您所看到的,在向其附加“field”之前复制arguments.data,可以解决问题。请注意,只需:
<cfset local.data=arguments.data>
还不够。
有人可以解释参数范围的这种行为吗?
所以在经过一些研究后,我在Adobe Coldfusion文档页面上找到了这一点(由我完成的文本结束):
关于参数范围
所有函数参数都存在于它们自己的范围中,即Arguments范围。 Arguments范围存在于函数调用的生命周期中。函数返回时,范围及其变量将被销毁。但是,销毁Argument作用域不会破坏ColdFusion通过引用传递给函数的变量,例如结构或查询对象。您用作函数参数的调用页面上的变量继续存在;如果函数更改参数值,则调用页面中的变量将反映更改的值。
这对我来说是一个大开眼界,它将使我在将来免于麻烦:)
以上是关于冷融论的奇怪行为在外部功能中幸存?的主要内容,如果未能解决你的问题,请参考以下文章
使用制服时 Xamarin OpenGL 片段着色器的奇怪行为
使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)
EDT违规是否可能在外部软件中导致NullPointerException?
将 Scaffold 放入 NestedScrollview 时的奇怪行为?在 SliverAppbar 下剪辑时自动滚动到顶部