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 和非作用域变量的主要内容,如果未能解决你的问题,请参考以下文章

跨域脚本 ColdFusion 问题

Javascript基础知识小测试

static关键字的作用

如何在服务器上/同一域下的多个 ColdFusion 应用程序之间共享会话?

逃逸闭包和非逃逸闭包

ColdFusion:获取变量类型