gpt4 book ai didi

function - 有没有办法直接与 CF9/10 中的无名声明参数范围交互?

转载 作者:行者123 更新时间:2023-12-04 20:45:22 24 4
gpt4 key购买 nike

如果你不知道我在说什么,试试这个:

<cffunction name="myFunc">
<cfargument name="myArg" default="foobar">
<cfdump var="#local#" label="local and arguments scopes before deleting myArg">
<cfset StructDelete(arguments, "myArg")>
<cfdump var="#local#" label="local and arguments scopes after deleting myArg">
<cfset StructDelete(local, "arguments")>
<cfdump var="#local#" label="local scope after deleting arguments scope">
<cftry>
<cfset writeOutput("myArg still exists, and evaluates to: " & myArg)>
<cfcatch>
<cfset writeOutput("myArg no longer exists")>
</cfcatch>
</cftry>
</cffunction>

<cfset myFunc()>

<cfexit>

如果您运行该代码,您会发现即使在删除参数和参数范围之后,您仍然可以通过无作用域引用访问声明的参数。这意味着存在一个未命名的作用域,其中包含声明参数的值的副本或引用。我试图找出是否有某种方法可以直接使用此范围,例如未记录的范围名称或底层 Java 中的 getter 方法。暂时将这视为一个纯粹的学术问题,因为我很确定我可能想到的任何用例都会被大多数有信誉的程序员立即驳回。

编辑

我认为提供我目前对 UDF 范围的理解的分割可能会很有用,因为 Adam 的回应有点模糊了界限。为简单起见,我将排除特定于 cfc 的东西......
  • 定义时没有作用域或“var”关键字的变量被放置在调用页面的变量作用域中。
  • 局部作用域包含在函数执行期间使用 var 关键字或局部作用域名称(例如 local.myvar、local["myvar"])创建的变量。它还包含参数范围。
  • 参数范围包含在函数调用中声明或传递的每个参数。也可以在函数执行期间向其中添加或删除变量。 arguments 作用域是局部作用域的成员,可以这样引用(例如 local.arguments.myvar、local.arguments[1]),但也可以独立引用(例如 arguments.myvar、arguments[1]) .
  • 有一个无名作用域,其中包含 的每个参数的副本。声明 (即包含在 cfargument 标记中,或包含在 cfscript 中函数定义开头的括号中)。我观察到与此范围相关的以下特征和行为:
  • 的参数未申报 未添加 到无名的范围。
  • 声明参数是将变量放入无名作用域的唯一方法,ColdFusion 似乎不会在任何其他情况下使用它。
  • 与参数作用域不同,无名作用域与本地作用域没有明显的关系。
  • 无名范围变量及其参数范围对应变量的值要么是对相同值的引用,要么以改变一个同时改变两者的方式相互连接。
  • 将新变量动态添加到参数确实 不是 将它添加到无名作用域(因为只有声明的参数被添加到无名作用域)。
  • 您不能删除无名范围的变量 通过传统方式(即 StructDelete()、ArrayDeleteAt())。您可以删除其参数范围内的对应项,但该值将通过无范围引用保持可用。 (有关完全删除已声明参数的方法,请参阅亨利的回答)。
  • 一旦从参数中删除了声明的参数,就可以独立设置其无名作用域对应物的值。即使将具有相同名称的变量添加回参数,这仍然是正确的。
  • CF9 和 CF10 中存在无名作用域,但(正如 Henry 和 Adam 指出的)在 Railo 中不存在。
  • 无名作用域位于 CF 作用域层次结构的绝对顶部,在使用无作用域引用时优先于所有其他作用域。这一点,连同前面关于不可删除性的观点,可能是关于无名作用域最重要的事情。与官方文档相反,特定于功能的范围层次结构如下:
  • 无名(声明的参数)
  • 本地
  • 参数
  • 最佳答案

    在 ColdFusion 中,所有参数都在每个函数开头的未命名函数局部作用域中复制。这段代码:

    <cfset writeOutput("myArg still exists, and evaluates to: " & myArg)>

    不是访问参数作用域,而是访问函数局部作用域。如果您更改了代码以访问参数范围,您将 - 不出所料 - 看到变量不再存在于那里。

    顺便说一下,R​​ailo 的行为并非如此。

    关于function - 有没有办法直接与 CF9/10 中的无名声明参数范围交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18730964/

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