Coldfusion和unscoped变量

时间:2014-07-25 09:39:19

标签: coldfusion

我目前正在检查所有功能和组件是否有未编码的变量。我正在使用一个名为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>

2 个答案:

答案 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>