小编Jör*_*ren的帖子

冷融论的奇怪行为在外部功能中幸存?

我已经将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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这就是我所做的:

  1. 在变量范围中引入数组以使其可全局访问
  2. 在本地范围内引用struct(local.data)
  3. 通过向_append函数调用数据来追加第一个字段项(名称)
  4. 以相同方式添加第二个字段项(电话)

此代码将导致以下输出:

转储输出

正如您所看到的,当您可能期望第一个索引应该具有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>
Run Code Online (Sandbox Code Playgroud)

它会给出以下输出:

输出转储2

正如您所看到的,在向其附加"field"之前复制arguments.data,可以解决问题.请注意,只需:

<cfset local.data=arguments.data>
Run Code Online (Sandbox Code Playgroud)

还不够.

有人可以解释参数范围的这种行为吗?

coldfusion scope arguments duplicates cffunction

5
推荐指数
1
解决办法
71
查看次数

标签 统计

arguments ×1

cffunction ×1

coldfusion ×1

duplicates ×1

scope ×1