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

时间:2017-12-15 11:43:05

标签: scope coldfusion duplicates arguments cffunction

我已经将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>

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

  1. 在变量范围内引入数组以使其可全局访问
  2. 在本地范围内引入struct(local.data)
  3. 通过调用_append函数
  4. 来追加第一个字段项(名称)
  5. 以相同方式添加第二个字段项(电话)
  6. 此代码将产生以下输出:

    Dump of output

    正如您所看到的,当您可能期望第一个索引应该具有field =&#34; name&#34;时,代码会生成具有重复条目的数组。 正如您所看到的,第二次调用_append的数据值包含属性&#34; field&#34;价值&#34;名称&#34;。从第一次调用函数开始,它似乎停留在参数范围内?这怎么可能。我认为参数范围被隔离到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>
    

    它将提供以下输出:

    Dump of output 2

    正如您所看到的,在追加&#34;字段&#34;之前复制arguments.data。它,解决了这个问题。请注意,只需执行以下操作:

    <cfset local.data=arguments.data>
    

    还不够。

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

1 个答案:

答案 0 :(得分:4)

经过一些研究后,我在Adobe Coldfusion文档页面上发现了这一点(由我完成的文本结束):

  

关于参数范围

     

所有函数参数都存在于它们自己的范围中,即Arguments范围。   Arguments范围存在于函数调用的生命周期中。函数返回时,范围及其变量将被销毁。   但是,销毁Argument作用域不会破坏ColdFusion通过引用传递给函数的变量,例如结构或查询对象。您用作函数参数的调用页面上的变量继续存在; 如果函数更改参数值,则调用页面中的变量将反映更改的值

这对我来说是一个大开眼界,它将使我在将来免于麻烦:)