我目前正在检查所有功能和组件是否有未编码的变量。我正在使用一个名为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>
答案 0 :(得分:5)
你应该使用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
答案 1 :(得分:5)
在你的第一个代码块中,输入是&#34; unscoped&#34;但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>