4

関数の引数で、オブジェクト リテラルで 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()は単なる例です。これは、引数の 1 つが構造体である、テストしたすべての関数で発生しています。

4

2 に答える 2

2

Railoで問題なく動作します。

localまた、スコープの代わりに他のコンテナを使用しても違いはありません。また、これを。でキャッチすることはできませんcftry

ループ内でローカルスコープのみをシリアル化する場合:

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

結果は次のとおりです。

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

バグのようです。マインドファイリング

于 2012-06-25T14:58:36.610 に答える
1

LOCAL関数内でのみ使用されるスコープです。LOCAL関数の外でスコープ変数を作成しようとすると、失敗します。

テストを書いて、すぐに証明します....

更新実際、私は CF 8 を使用していて、テストできません。

CF8 以下では を設定できますがLOCAL.Foo、実際には CF スコープではありません。

CF9 以降でLOCALは、関数内でのみ設定できます。

<cffunction>
   <cfset LOCAL.foo = 1>
   <cfreturn LOCAL.foo>
</cffunction>
于 2012-06-25T14:27:28.087 に答える