在 ColdFusion UDF 中,有没有办法从父函数范围引用变量?

Posted

技术标签:

【中文标题】在 ColdFusion UDF 中,有没有办法从父函数范围引用变量?【英文标题】:In ColdFusion UDFs is there a way to reference a variable from the parent function scope? 【发布时间】:2017-01-19 19:18:53 【问题描述】:

如果您遇到一个 UDF 在其中调用另一个 UDF 的情况,是否可以在不将其作为参数传递的情况下引用父级的本地范围?我的直觉告诉我这是不可能的,因为函数的本地范围应该被设计隔离。

例如:

<cffunction name="function01">

     <cfset var fruit = "apple" />

     <cfset function02() />

</cffunction>

<cffunction name="function02">

     <cfdump var="#fruit#" /> <!--- can I reference fruit? --->

</cffunction>

我知道如何让 function02 访问父 UDF 的局部范围变量的唯一方法是将其作为参数传递。当然,我想你也可以使用 REQUEST、FORM、URL、SESSION 和 APPLICATION 范围。

<cffunction name="function01">

     <cfset var fruit = "apple" />

     <cfset function02(fruit) />

</cffunction>

<cffunction name="function02">

     <cfargument name="fruit" />

     <cfdump var="#fruit#" />

</cffunction>

【问题讨论】:

使用参数似乎是正确的选择,你为什么不想那样做呢? 这更多是出于好奇。我知道使用 标签可以使用 CALLER 范围。对于 标签,我没有看到任何对此类内容的引用。 如果两个函数在同一个文件中,把function01中的var字去掉。当然,这会改变问题,因为它不再是父级的本地范围。 我没有看到任何关于 标签的类似内容的引用 嗯,就像你说的:范围是故意设计为隔离的。所以不应该有一个记录的方式来做你所要求的。只需使用其他人提到的参数范围。 如果它是一个静态变量,您可以将其移出函数并移入组件中。然后只需使用 this 标记而不是使其成为本地范围。然后,您可以在所需的两个函数中调用this.var 【参考方案1】:

通过在前面声明fruitvar,它只适用于本地范围(在函数内)。

尝试:

<cffunction name="function01">

     <cfset fruit = "apple" />

     <cfset function02() />

</cffunction>

<cffunction name="function02">

     <cfdump var="#fruit#" /> <!--- can I reference fruit? --->

</cffunction>

这可能有效,但不是“干净”的处理方式,最好使用参数

【讨论】:

【参考方案2】:

根据每个人的 cmets,正确答案是您不能从子函数中引用局部作用域变量。传递引用的唯一方法是将变量作为参数传递给子函数,或者将变量存储在不同的范围内(例如 VARIABLES、FORM、URL、REQUEST、SESSION、APPLICATION、SERVER 等。 ..)

首选方法是将变量作为参数传递给子函数:

<cffunction name="function01">

     <cfset var fruit = "apple" />

     <cfset function02(fruit) />

</cffunction>

<cffunction name="function02">

     <cfargument name="fruit" />

     <cfdump var="#fruit#" />

</cffunction>

【讨论】:

以上是关于在 ColdFusion UDF 中,有没有办法从父函数范围引用变量?的主要内容,如果未能解决你的问题,请参考以下文章

包含文件中的 ColdFusion 用户定义函数不可用

ESLint:我如何告诉eslint忽略coldfusion评论

如何在 ColdFusion 中获取计划任务列表和上次运行结果?

在 PySpark 中,有没有办法使用运行时给出的 Python 类的函数来动态注册 UDF? [复制]

如何在ColdFusion 2016中动态设置电子表格自动过滤器?

在 Apache Pig 中运行 UDF