ColdFusion 11:在 <CFSET> 标记中使用 #Evaluate# 设置变量之间的区别

ColdFusion 11: Difference between setting a variable with a #Evaluate# in a <CFSET> tag

在处理遗留 ColdFusion 应用程序时,我遇到了 <cfset> 标记在整个应用程序中的使用方式不匹配的问题。使用评估运算符 # # 和不使用

设置相同的变量

我在应用范围上遇到过这个

<cfset #application.test# = "test">
<cfset application.test = "test2">

以及 on 变量范围 ...

<cfset myvariable = 6> 
<cfset #myvariable# = 5>

完成后

<cfdump var=#variables#>
<cfdump var=#application#>



test        == "test2" 
myvariable  == 5

看来它们确实引用了相同的变量。

我想知道是否有任何我需要注意的最佳实践/边缘案例/幕后发生的事情......或者评估操作员在这种情况下没有做太多事情?

(变量的作用域重要吗?)

# 告诉 CFML 解析器评估被它们包围的术语,这在字符串中很有用。如果您在 <cfloop array="#myArray#"... 等标记属性中传递变量,或希望避免 "Hello #name#!" 中的字符串连接,或需要 <cfargument name="datetime" default="#now()#"> 等动态表达式,则它们是必需的。您示例中的磅没有任何作用,也不会影响性能。虽然在不需要时使用磅被认为是不好的做法。

范围界定很重要。一些范围(部分)是持久的(applicationrequestsession),其他范围是易变的(variableslocal)。这取决于上下文。 cfcomponent 中的 variables 是私有实例字段范围,而 .cfm 模板中的 variables 就像局部变量一样工作。要在函数中使用局部变量,可以使用 var 关键字或 local 作用域。 Have a look at the official documentation about all the scopes.

您应该指定范围,因为每当您省略范围时,ColdFusion 都会尝试通过搜索一组范围并选择第一个具有匹配名称的范围来查找变量。这会产生性能开销(尽管几乎可以忽略不计),并且会因为变量泄漏而导致奇怪的问题。有些人(包括我)不在 cfcomponent 之外指定 variables,因为它是默认范围。由你决定。