如果您没有完全确定变量的范围,则存在范围问题。
你会得到人们说你不会遇到足以证明额外输入的问题,而且它不是 DRY,但是因为 ColdFusion 有一个范围评估顺序,如果你有想要在任何上下文中工作的代码,它是必需的。
下面的“查询循环”是指一个cfloop
或cfoutput
带有一个query
参数。
所以你可以#columnname#
在查询循环中使用。
您可以 #queryName.columnName#
在查询循环内部或外部。
你应该 #cfScope.queryName.columnName#
在所有情况下。
这是一个出错的例子。希望您永远不必处理这样的代码,但这有助于指出 ColdFusion 广泛的范围评估存在的问题。
<cfset testcfc = new Test().scopeTest()>
和
<cfcomponent output="false">
<cffunction name="scopeTest" access="public" output="true" returntype="void">
<cfargument name="Query" type="query" required="false" default="#QueryNew("xarguments")#">
<cfargument name="xlocal" type="string" required="false" default="This is not from a query; Arguments scope.">
<cfset QueryAddRow(Arguments.Query, 1)>
<cfset Arguments.Query["xarguments"][1] = "this is the arguments scope query">
<cfset local.Query = QueryNew("xlocal")>
<cfset QueryAddRow(local.Query, 1)>
<cfset local.Query["xlocal"][1] = "this is the local scope query">
<cfset Variables.Query = QueryNew("xVariables")>
<cfset QueryAddRow(Variables.Query, 1)>
<cfset Variables.Query["xVariables"][1] = "this is the variables scope query">
<cfset local.xlocal = "This is not from a query; local scope.">
<cfloop query="Query">
<cfoutput>#xlocal#</cfoutput>
</cfloop>
<cfdump var="#Arguments#" label="Arguments">
<cfdump var="#local#" label="local">
<cfdump var="#variables#" label="Variables">
<cfabort>
</cffunction>
</cfcomponent>
输出的结果是这不是来自查询;参数范围。 与范围评估文档的内容以及其他人希望您相信的内容相反。
正如其他人所建议的那样,您可以将输出行更改为读取<cfoutput>#Query.xlocal#</cfoutput>
,但这也无济于事。相反,您会被告知该列不存在。将其更改为<cfoutput>#Query.xarguments#</cfoutput>
将表明它使用的是Arguments
版本Query
而不是local
or Variables
。
那么怎么样:
<cfloop query="local.Query">
<cfoutput>#xlocal#</cfoutput>
</cfloop>
没有。仍然不是想要的结果。好的,那么如何将查询名称添加到输出中:
<cfloop query="local.Query">
<cfoutput>#Query.xlocal#</cfoutput>
</cfloop>
没有。仍然不是想要的结果。如果您想确保获得正确的结果,您必须全面了解所有内容。
<cfloop query="local.Query">
<cfoutput>#local.Query.xlocal#</cfoutput>
</cfloop>
这比任何人都想做的要多得多,但如果你想确保代码中没有任何令人讨厌的错误,这是必需的。