2017-08-23 2 views
3

私はリストを持っており、関数内のいくつかの要素を削除したい。私は削除したい要素をその関数に構造体として渡します。私は関数ListFilterを使ってリストを反復することができると思った。この関数に引数として関数を渡すので、私はArgumentsのスコープに私のcffunctionがアクセスできるか疑問に思っています。このクロージャは "外部"変数にアクセスできますか?これらはどの範囲に存在しなければなりませんか?cffunctionでListFilterを使用する可能性

<cffunction name="funcA" returntype="string"> 
    <cfargument name="struExcludeCols" type="struct"> 

    <cfset local.strLst = "Listel1,Listel2,Listel3"> 

    <cfscript> 
     local.columnNames = ListFilter( 
      strLst, 
      function(strCol) {    
       return not StructKeyExists(Arguments.struExcludeCols, strCol);  
      } 
     ); 
    </cfscript> 

    <cfreturn local.columnNames> 
</cffunction> 


<cfdump var="#funcA({ "Listel2" = 1 })#"> 
+0

あなたはclosure' 'とはどういう意味ですか? –

+0

@DanBracuk Closureは第2引数として 'ListFilter'に渡す「インライン関数」です。 –

+0

ちょうどこのstackoverflowの投稿を参照してください:https://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-ambda 'クロージャ[...]そのパラメータリストには '。これは私の場合は機能しないので、閉鎖ではありません。 ;)それで 'ラムダ '。 –

答えて

2

ListFilter内からインライン関数はfuncAArguments範囲にアクセスすることはできません。それはthisへのアクセス権を持っています。

の作業コード:

<cffunction name="funcA" returntype="string"> 
    <cfargument name="struExcludeCols" type="struct"> 

    <cfset local.strLst = "Listel1,Listel2,Listel3"> 
    <cfset this.struExcludeCols = Arguments.struExcludeCols> 

    <cfscript> 
     local.columnNames = ListFilter( 
      strLst, 
      function(strCol) {    
       return not StructKeyExists(this.struExcludeCols, strCol);  
      } 
     ); 
    </cfscript> 

    <cfreturn local.columnNames> 
</cffunction> 


<cfdump var="#funcA({ "Listel2" = 1 })#"> 
+0

'this'はcfcのグローバルプライベートスコープです。それを汚染したくないですが、私の質問に答えます。ありがとうございました! –

関連する問題