Coldfusion 和非作用域变量
Posted
技术标签:
【中文标题】Coldfusion 和非作用域变量【英文标题】:Coldfusion and unscoped variables 【发布时间】:2014-07-25 09:39:19 【问题描述】:我目前正在检查我的所有函数和组件是否有未作用域的变量。我正在使用一个名为varscoper4 的工具来检查所有功能。给定以下代码,varscoper 告诉我第 4 行的变量“input”在 unscoped 中。这是真的吗?如果我改变它,我是否需要限定参数变量的范围?
<cfoutput>#testit(1)#</cfoutput>
<cffunction name="testit">
<cfargument name="input">
<Cfset input = 3>
<cfreturn input>
</cffunction>
仅供参考,如果我不更改函数 varscoper4 中的参数变量输入,则不会报告任何非作用域变量。
<cfoutput>#testit(1)#</cfoutput>
<cffunction name="testit">
<cfargument name="input">
<Cfset var output = 3 + input>
<cfreturn output>
</cffunction>
【问题讨论】:
【参考方案1】:在您的第一个代码块中,输入是“无范围的”,但 CF 将其解释为参数范围。 CF 将始终尝试通过查看优先级顺序来查找未作用域的变量。你可以在这里找到更多信息:http://www.learncfinaweek.com/week1/Scopes/
您还可以通过转储不同的作用域并查看输出来亲自查看它的外观。
<cfoutput>#testit(1)#</cfoutput>
<cffunction name="testit">
<cfargument name="input">
<cfset input = 3>
<cfdump var="#variables#" label="variables">
<cfdump var="#arguments#" label="arguments">
<cfdump var="#local#" label="local">
<cfreturn input>
</cffunction>
我强烈建议您将 varscoper 工具的输出作为您应该明确定义变量范围的指南。在这种情况下,您的第一个代码块将如下所示。这是为了让您的代码更加清晰和确定。
<cfoutput>#testit(1)#</cfoutput>
<cffunction name="testit">
<cfargument name="input">
<cfset arguments.input = 3>
<cfdump var="#variables#" label="variables">
<cfdump var="#arguments#" label="arguments">
<cfdump var="#local#" label="local">
<cfreturn arguments.input>
</cffunction>
就我个人而言,我不喜欢在我的函数和方法中设置或更改参数。我宁愿让它们像您在第二个代码块中那样保持纯正。但即使在那里,我也会明确地确定参数的范围,以便您知道它来自哪里——即使没有被 varscoper 标记
<cfoutput>#testit(1)#</cfoutput>
<cffunction name="testit">
<cfargument name="input">
<cfset var output = 3 + arguments.input>
<cfdump var="#variables#" label="variables">
<cfdump var="#arguments#" label="arguments">
<cfdump var="#local#" label="local">
<cfreturn output>
</cffunction>
如果不清楚,最后要在此处添加的是 var 作用域将所有内容都放入本地作用域。你也可以这样做,它在功能上等同于前面的代码块:
<cfoutput>#testit(1)#</cfoutput>
<cffunction name="testit">
<cfargument name="input">
<cfset local.output = 3 + arguments.input>
<cfdump var="#variables#" label="variables">
<cfdump var="#arguments#" label="arguments">
<cfdump var="#local#" label="local">
<cfreturn local.output>
</cffunction>
【讨论】:
关于 CF 寻找正确范围的说明。如果您确定变量的范围,CF 就不必进行此搜索,您的应用程序将更加高效。请记住,您只需键入一次范围。 我认为关于范围界定的另一个注意事项是,它可以使任何可能需要在以后进入代码的开发人员更容易。函数可能是一个不好的例子,因为它们本身是“包含”的。一个常规的旧 CFM 页面虽然引用了#Foo#,但可能会让开发人员想知道“Foo”变量如何进入页面的意图是什么……意味着它应该来自表单、url、在其他地方设置等等。 【参考方案2】:你应该使用 arguments.input:
<cfset arguments.input = 3>
虽然更好的是使用您的第二个示例,arguments
范围:
<cfset var output = 3 + arguments.input >
不要修改arguments
,当它们到达时保持原样,以防您以后想重新使用原始值。
http://help.adobe.com/livedocs/coldfusion/8/htmldocs/help.html?content=buildingComponents_29.html
【讨论】:
以上是关于Coldfusion 和非作用域变量的主要内容,如果未能解决你的问题,请参考以下文章