<cfquery>变量初始化作用域、默认作用域及GC回收问题问询
ColdFusion
<cfquery> 作用域相关问题解答 1. <cfquery>会将变量初始化到哪个作用域?
当你用<cfquery name="yourQueryName">生成查询对象时,这个变量的存储位置完全看它所在的代码上下文:
- 如果是在**.cfm模板的顶层**(没放在自定义函数、CFC方法或者自定义标签里),默认会被存到
Variables作用域。你直接写yourQueryName或者加上前缀Variables.yourQueryName都能访问到它。 - 如果是在自定义函数或CFC方法内部(ColdFusion 9及以后版本),默认会归到
Local作用域里——这是CF9之后的特性,函数里没指定作用域的变量默认都是本地的,防止不小心污染全局作用域。当然你也可以手动加作用域前缀(比如Variables.yourQueryName),强制把它放到其他作用域。
2. 在.cfm模板中,<cfquery>默认使用哪个作用域?请求结束后这些变量会被垃圾回收(GC)收集吗?
变量查找的作用域顺序
当你在<cfquery>的SQL语句里引用变量(比如写SELECT * FROM users WHERE id = #userId#),ColdFusion会按固定顺序在各个作用域里找这个变量:Local → Arguments → Variables → CGI → URL → Form → Cookie → Session → Application → Server
简单说就是从最局部的作用域开始找,找到匹配的就用。不过这里强烈建议给变量加上明确的作用域前缀,不然很容易出现变量名冲突或者引用错变量的情况。
垃圾回收的情况
肯定会被回收的!因为<cfquery>创建的查询变量不管存在Variables还是Local作用域,都属于请求级作用域——它们的生命周期只跟着当前这一次HTTP请求走。当请求处理完、响应发回给客户端之后,ColdFusion会把这些请求级作用域里的所有变量都销毁,标记成可回收资源,之后垃圾回收机制会在合适的时机把这些资源清理掉。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

