2012-05-15 47 views
10

Adobe ColdFusion 10: Using closures documentation引用:如何在CF10範圍內關閉變量?

function helloTranslator(String helloWord) 
{ 
    return function(String name) 
    { 
     return "#helloWord#, #name#"; 
    }; 
} 

如何範圍helloWordname正確返回行?他們是否都在Arguments範圍內?如果是這樣的話,他們必須是獨一無二的?

Closures and functions部還提到有對已經長範圍搜索的頂部4多個範圍:

在閉合,以下是搜索的用於無作用域變量的順序:

  1. Closure的如果local範圍
  2. Closure的arguments範圍
  3. 外部函數的local範圍availa竹葉提取
  4. 所有者功能的local範圍(如果可用)
  5. ColdFusion的內置範圍

如果我的東西範圍爲'local.',將它只能搜索1或1,3 & 4?

順便說一句,我明白Closure &外面。誰是店主

謝謝


更新:改進請求提交:ColdFusion 10.0 - Feature 3191742

回答

7
function helloTranslator(String helloWord) 
    { 
     return function(String name) 
     { 
     return "#helloWord#, #name#"; 
     }; 
    } 

這裏helloWordname不能作用域。有一個隱含的「閉包在一個函數內定義」,這是聲明(父)函數的局部範圍,其中存在這些變量。所以這些變量必須是唯一的(在函數內)才能從閉包中訪問。

在閉合,尋找無作用域變量經歷:

  1. Closure的局部範圍
  2. Closure的參數範圍
  3. 外/所有者函數的局部範圍(如果可用)
  4. 外/所有者函數的參數範圍如果可用
  5. 變量範圍(可在創建時關閉)
  6. ColdFu sion內置示波器

如果範圍爲Local,則在閉包中,它將僅搜索1。 AFN沒有辦法直接爲3,4範圍。

p.s.因爲前面提到的Owner範圍不過是一個隱式範圍,它指向創建閉包時父/外函數本地範圍的緩存副本。

p.s.你可以用log an enhancement with ColdFusion來明確這個範圍。

不同範圍的例子如下。運行這個,你會理解閉包如何使用不同的範圍。

any function exampleClosureForm(arg1){ 

    function x(innerArg1,innerArg2){ 
     //var arg1= 50;// will hide parent's arg1 if declared 
     writedump(arguments);// would dump closure's 
     writedump(local);// would dump closure's 
     writedump(session.a); // would be same session shared across 
     writedump(arg1); // would dump parents argument arg1 
     return session.a-- + innerArg1+innerArg2+arg1--;// decrementing to see its behavior for successive call 
    }; 
    writeoutput(x(1,2)); 
    writedump(arguments,"browser","html",false,"function");// would dump parent's 
    writedump(local,"browser","html",false,"function");// would dump parent's 
    arg1 = -100; // since closure is sharing the parent's variable, this change should get reflected 
    return x; 
} 
session.a = 10; 
a = exampleClosureForm(10); 
writeoutput("now the calls <br>"); 
writeoutput(a(innerArg1=5,innerArg2=5)); 
writeoutput("<br>"); 
// with argumentcollection 
argsColl = structNew(); 
argsColl.innerArg1= 1; 
argsColl.innerArg2= 3; 
writeoutput(a(argumentCollection = argsColl)); 
+0

能否請您提供一個更完整的代碼示例,然後標籤,該標籤變種屬於哪個範圍?並且在創建閉包時可以使用什麼var?也許是關於這個話題的博客文章?它變得混亂。謝謝。 – Henry

+0

ER提交:https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

+1

@Henry示例不適合在評論中,所以我正在爲此提出一個單獨的答案 –

2

是啊,據我所知,一個不能指定父函數的參數的範圍,所以你關閉的議論需要有不同的名字。什麼,你需要做的是在父功能的中介變量,使用不同的名稱:

function helloTranslator(String s){ 
    var otherS = arguments.s; 
    return function(String s){ 
     return "#otherS#, #s#"; 
    }; 
} 

這不是很理想:一個應該能夠引用父的參數範圍,一個範圍化的時尚,不只是要求CF尋找一場比賽。如果我是你,我會raise a bug with Adobe

+0

ER領域:https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry