在ColdFusion中,变量按什么顺序解析?

use*_*580 8 variables coldfusion scope

我对变量解析顺序没什么印象,但我在CFML Reference或ColdFusion Dev Guide中找不到它.有人可以帮忙吗?

小智 19

范围订单

ColdFusion 9的规范范围顺序是:

  1. 本地(仅限CFC和UDF)
  2. 参数(仅在CFC和UDF内)
  3. 线程本地(仅在内部线程)
  4. 查询(仅在查询循环内)
  5. 线程(仅在调用线程的线程和模板内)
  6. 变量
  7. CGI
  8. CFFILE
  9. 网址
  10. 形成
  11. 曲奇饼
  12. 客户

您可以在开发ColdFusion 9应用程序中查看Adobe的相关文档.

但是,某些范围仅在某些上下文中可用,因此搜索范围的顺序是不同的,具体取决于代码的上下文.

内部CFML(无线程)

  1. 变量
  2. CGI
  3. CFFILE
  4. 网址
  5. 形成
  6. 曲奇饼
  7. 客户

在CFC内部(没有线程)

  1. 本地
  2. 参数
  3. 查询(仅在查询循环内)
  4. 变量
  5. CGI
  6. CFFILE
  7. 网址
  8. 形成
  9. 曲奇饼
  10. 客户

最佳实践

正如Al Everett在他的回答中指出的那样,始终将变量作为范围被认为是最佳实践.显式作用域产生较少的模糊代码,通常更快.只要不对变量进行范围调整,就有可能从您不想要的范围中获取变量.

当您访问的变量位于搜索顺序的第一个范围内时,实际上将变量保持为无范围的速度稍微快一些.这是因为ColdFusion解析它时,变量名中的每个点都会产生很小的代价.例如,在CFC方法是稍快访问myVarlocal.myVar.这仅适用于:

  • local CFC或UDF中的范围变量
  • 线程local范围内的线程变量
  • variables CFML中的范围变量

在所有其他情况下,显式声明范围更快(更清晰).

使用这种技术应被视为不良做法.您应该只在性能关键代码中使用此技术,在此代码中您可以保证变量始终存在于预期范围内.请记住,这是以增加歧义为代价的.


ale*_*ale 16

始终将变量作为范围是一种普遍接受的最佳实践,主要有两个原因:

  • 性能 - CF不需要通过依次搜索范围来查找变量
  • 准确性 - 如果两个变量在不同的范围内具有相同的名称,则可能无法获得您期望的变量

也就是说,这里是搜索订单变量范围:

  1. 函数本地(VAR关键字)
  2. 线程本地(CFTHREAD)
  3. 查询结果
  4. 功能ARGUMENTS
  5. 局部变量
  6. CGI变量
  7. 文件变量
  8. 网址参数
  9. 表格字段
  10. COOKIE价值观
  11. 客户变量

编辑:它还告诉你注意搜索的范围:SESSION,SERVER,APPLICATION