对象文字内的ColdFusion局部范围

时间:2012-06-25 13:47:41

标签: coldfusion coldfusion-9

在函数参数中,在对象文字中使用CF的局部作用域时,我看到了一些奇怪的行为。但只有在循环内执行...

示例代码:

<cffunction name="f">
    <cfoutput>
        <cfset LOCAL.foo = 123 />       

        <!--- Works fine --->
        #serializeJSON({blah = LOCAL.foo})#

        <!--- Works fine --->
        <cfloop from=1 to=1 index="i">
            <cfset bar = {blah = LOCAL.foo} />
            #serializeJSON(bar)#
        </cfloop>

        <!--- Element FOO is undefined in LOCAL --->
        <cfloop from=1 to=1 index="i">  
            #serializeJSON({blah = LOCAL.foo})#
        </cfloop>
    </cfoutput>
</cffunction>


<cfset f() />

PS:serializeJSON()仅用于举例。这是在我测试的任何函数中发生的,其中一个参数是结构。

2 个答案:

答案 0 :(得分:2)

在Railo中工作得很好。

如果使用任何其他容器而不是local范围,它也没有任何区别,也不可能用cftry来识别它。

如果在循环中仅序列化本地范围:

<cfloop from=1 to=1 index="i">
    #serializeJSON(local)#
</cfloop>

结果是:

{"ARGUMENTS":{},"___IMPLICITARRYSTRUCTVAR1":{"BLAH":123},"___IMPLICITARRYSTRUCTVAR0":{"BLAH":123},"FOO":123} 

看起来像个错误。记住filing

答案 1 :(得分:1)

LOCAL是仅在函数中使用的范围。如果您尝试在函数之外创建LOCAL范围变量,它将失败。

我会写一个测试并在一分钟内向你证明......

更新实际上,我有CF 8在工作,无法测试。

在CF8及以下版本中,您可以设置LOCAL.Foo,但它并不是CF范围。

在CF9及以上版本中,LOCAL只能在函数中设置。

<cffunction>
   <cfset LOCAL.foo = 1>
   <cfreturn LOCAL.foo>
</cffunction>