gpt4 book ai didi

scope - 在函数外幸存的冷聚变参数的奇怪行为?

转载 作者:行者123 更新时间:2023-12-04 19:28:52 26 4
gpt4 key购买 nike

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

正如你所看到的,这就是我所做的:
  • 在变量范围内初始化一个数组以使其可全局访问
  • 在本地范围内初始化一个结构 (local.data)
  • 通过将数据调用到 _append 函数来附加第一个字段项(名称)
  • 以相同的方式附加第二个字段项(电话)

  • 此代码将导致以下输出:

    Dump of output

    如您所见,该代码会生成一个包含重复条目的数组,而您可能期望第一个索引应具有 field="name"。
    您还可以看到,第二次调用 _append 的数据值包含值为“name”的属性“field”。从我们第一次调用函数开始,它似乎就在参数范围内徘徊?这怎么可能。我认为参数范围被隔离到 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

    如您所见,在向其附加“字段”之前复制 arguments.data 可以解决问题。请注意,只是这样做:
    <cfset local.data=arguments.data>

    还不够。

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

    最佳答案

    因此,经过一番研究,我在 Adob​​e Coldfusion 文档页面(我完成的文本加粗)上发现了这一点:

    About the Arguments scope

    All function arguments exist in their own scope, the Arguments scope.The Arguments scope exists for the life of a function call. When the function returns, the scope and its variables are destroyed.However, destroying the Argument scope does not destroy variables, such as structures or query objects, that ColdFusion passes to the function by reference. The variables on the calling page that you use as function arguments continue to exist; if the function changes the argument value, the variable in the calling page reflects the changed value.


    这让我大开眼界,它会让我在 future 远离麻烦:)

    关于scope - 在函数外幸存的冷聚变参数的奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831679/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com