Syntax 如何使用括号表示法访问作用域?

Syntax 如何使用括号表示法访问作用域?,syntax,coldfusion,scope,Syntax,Coldfusion,Scope,作为函数的输入,我得到一个字符串scopename,如FORM或COOKIE。 如何以括号表示法访问这些顶级作用域 我要找的东西是: var myScope = "FORM"; global[myScope]; 显然,这是行不通的:) (我不是在寻找任何类型的eval函数,我宁愿手动切换字符串以获得正确的范围,而不是eval函数……) 编辑 功能是必需的,因此我可以在请求的早期调用一个简单/可访问的函数,以识别发送错误类型数据或只是不发送所需数据的错误请求 例如,我将在需要变量FORM.dat

作为函数的输入,我得到一个字符串scopename,如
FORM
COOKIE
。 如何以括号表示法访问这些顶级作用域

我要找的东西是:

var myScope = "FORM";
global[myScope];
显然,这是行不通的:)

(我不是在寻找任何类型的
eval
函数,我宁愿
手动切换
字符串以获得正确的范围,而不是
eval
函数……)

编辑

功能是必需的,因此我可以在请求的早期调用一个简单/可访问的函数,以识别发送错误类型数据或只是不发送所需数据的错误请求

例如,我将在需要变量
FORM.data1:numeric
FORM.data2:bit
COOKIE.data3:string
的请求中尽早调用以下函数:

<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>

我知道,以下几点可能会更容易一些:

<cfset require({
  "FORM.data1":"numeric",
  "FORM.data2":"bit",
  "COOKIE.data3":"string"
})>


除了定义了使用
之外,我还需要为其他功能提供更多的灵活性。

我认为不使用
评估
功能是不可能的。可以说,作用域位于链的顶层,因此前面没有点符号。

您可以使用
structGet()

var theformscope = structGet('form');

有关structGet的更多信息,请参见ColdFusion文档:

嗯,最简单的解决方案就是这样编写:

<cfparam name="form.data1"   type="numeric" />
<cfparam name="form.data2"   type="numeric" />
<cfparam name="cookie.data3" type="string" />
<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>


<cffunction name="require" returntype="void" output=false >
    <cfargument name="Scopes" type="Struct" required />

    <cfloop item="local.CurScope" collection=#Arguments.Scopes#>
        <cfloop item="local.CurVar" collection=#Arguments.Scopes[CurScope]#>
            <cfparam name="#CurScope#.#CurVar#" type="#Arguments.Scopes[CurScope][CurVar]#" />
        </cfloop>
    </cfloop>
</cffunction>


但是,如果您觉得太冗长,可以使用现有的数据结构,如下所示:

<cfparam name="form.data1"   type="numeric" />
<cfparam name="form.data2"   type="numeric" />
<cfparam name="cookie.data3" type="string" />
<cfset require({
  "FORM" : {
    "data1":"numeric",
    "data2":"bit"
  },
  "COOKIE":{
    "data3":"string"
  } 
})>


<cffunction name="require" returntype="void" output=false >
    <cfargument name="Scopes" type="Struct" required />

    <cfloop item="local.CurScope" collection=#Arguments.Scopes#>
        <cfloop item="local.CurVar" collection=#Arguments.Scopes[CurScope]#>
            <cfparam name="#CurScope#.#CurVar#" type="#Arguments.Scopes[CurScope][CurVar]#" />
        </cfloop>
    </cfloop>
</cffunction>


或者,还有一种更简单的方法:

<cfset require
    ( "FORM.data1"   : "numeric"
    , "FORM.data2"   : "bit"
    , "COOKIE.data3" : "string"
    )>

<cffunction name="require" returntype="void" output=false >

    <cfloop item="local.ArgName" collection=#Arguments#>
        <cfparam name="#ArgName#" type="#Arguments[ArgName]#" />
    </cfloop>

</cffunction>


您暗示您需要其他功能的非范围名称,在这种情况下,您只需执行

您不需要。作用域已经是全局的。你为什么要这么做?(可能有更好的方法。)使用Evaluate()。这就是它的目的,除非代码处于一个特别紧密的循环中,否则不会有性能问题。如果输入可能会受到用户输入的影响,请注意对其进行清理。搜索所有作用域似乎不符合开始搜索变量的目的。@Busches我不是在所有作用域中搜索,而是在定义的作用域中搜索,一个在论点中给出的function@PeterBoughton我正在创建一个函数,该函数可以评估所有必需的变量是否可用以及类型是否正确,如果不以不同的方式处理请求,例如
400错误请求
,该答案是否正确,但我仍然坚持认为,传递一个范围名称字符串不太可能是这里所做的任何事情的正确解决方案。你可能是对的,但是没有太多的信息可供使用,所以我只是回答所问的问题。我只使用过一次这种技术,它是用于抽象范围的对象。作用域可以是任意的,因此在ColdSpring中以字符串形式发送作用域名称,然后使用structGet()获取它的句柄实际上是有益的。是的,该注释更多地针对将来可能出现的人,只是不经思考就使用该函数。一般来说,传递作用域本身而不是(或同时传递)名称可能是一个更好的主意。很好的解决方案。你是对的,这看起来确实更简洁,尤其像上一个例子的简单性。Peter,运行下面的例子需要什么?我似乎无法让它在CF9中工作。谢谢。“我好像没法让它工作”——还有。。。?当你尝试时会发生什么?它是否给出了错误消息,或者仅仅是意外的结果?