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

时间:2009-07-20 08:11:11

标签: coldfusion variables scope

我对变量解析顺序没什么印象,但我在CFML参考或ColdFusion开发指南中找不到它。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:19)

范围订单

ColdFusion 9的规范范围顺序是:

  1. 本地(仅限CFC和UDF内部)
  2. 参数(仅限CFC和UDF)
  3. 线程本地(仅限内部线程)
  4. 查询(仅在查询循环内)
  5. 线程(仅在调用线程的线程和模板内部)
  6. 变量
  7. CGI
  8. CFFILE
  9. URL
  10. 表格
  11. 曲奇
  12. 客户端
  13. 您可以在Developing ColdFusion 9 Applications

    中查看Adobe的相关文档

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

    内部CFML(无线程)

    1. 变量
    2. CGI
    3. CFFILE
    4. URL
    5. 表格
    6. 曲奇
    7. 客户端
    8. 在CFC内部(无线程)

      1. 本地
      2. 参数
      3. 查询(仅在查询循环内)
      4. 变量
      5. CGI
      6. CFFILE
      7. URL
      8. 表格
      9. 曲奇
      10. 客户端
      11. 最佳实践

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

          

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

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

        在所有其他情况下,明确声明范围更快(更清晰)。

             

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

答案 1 :(得分:16)

始终范围变量是一种普遍接受的最佳做法,主要有两个原因:

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

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

  1. 功能本地(VAR关键字)
  2. 线程本地(CFTHREAD)
  3. 查询结果
  4. 功能ARGUMENTS
  5. Local VARIABLES
  6. CGI变量
  7. 文件变量
  8. 网址参数
  9. FORM字段
  10. COOKIE值
  11. 客户变量
  12. 编辑:它还会告诉您搜索的范围:SESSION,SERVER,APPLICATION