2012-05-15 15 views
10

Phần trích dẫn từ Adobe ColdFusion 10: Using closures documentation:Làm thế nào để phạm vi các biến đóng của CF10?

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

Làm thế nào để phạm vi helloWordname đúng trên đường trở lại? Cả hai có nằm trong phạm vi Arguments không? Nếu đó là trường hợp, họ phải là duy nhất?

Phần Closures and functions cũng đề cập đến có thêm 4 phạm vi trên đầu trang của tìm kiếm phạm vi đã lâu:

Trong đóng cửa, sau là thứ tự tìm kiếm cho một biến unscoped:

  1. Đóng của local phạm vi
  2. Đóng cửa của arguments phạm vi
  3. Hàm ngoài local phạm vi nếu availa ble
  4. Chủ chức năng của phạm vi local nếu có
  5. ColdFusion built-in Nếu tôi phạm vi một cái gì đó như 'local.', sẽ chỉ tìm kiếm 1 hoặc 1,3 & 4 phạm vi

?

BTW, tôi hiểu Đóng cửa & Bên ngoài. Ai là Chủ sở hữu?

Cảm ơn bạn


Cập nhật: Enhancement Yêu cầu nộp: ColdFusion 10.0 - Feature 3191742

Trả lời

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

Ở đây helloWordname không thể bị nhiễu. Có một phạm vi ngụ ý Owner với "đóng cửa được xác định trong một hàm" là phạm vi cục bộ của hàm khai báo (cha mẹ), nơi các biến này có mặt. Vì vậy, các biến này phải là duy nhất (trong hàm) để được truy cập từ các bao đóng.

Trong đóng cửa, tìm kiếm một biến unscoped đi qua: phạm vi địa phương

  1. Đóng cửa của
  2. luận Đóng cửa của phạm vi
  3. phạm vi địa phương
  4. Outer/Chủ đầu chức năng nếu có sẵn
  5. phạm vi tranh luận
  6. Outer/Chủ đầu chức năng của nếu có sẵn
  7. Phạm vi biến (có sẵn tại thời điểm tạo vật đóng)
  8. ColdFu phạm vi tích hợp sion

Nếu có gì đó bị cắt như Local, khi đóng, nó sẽ chỉ tìm kiếm trong 1. AFN không có cách nào để trực tiếp phạm vi cho 3,4.

p.s. như đã nói trước đó phạm vi Owner là gì, nhưng một phạm vi tiềm ẩn trỏ đến một bản sao được lưu trữ của phạm vi địa phương của cha mẹ/bên ngoài của chức năng tại thời điểm tạo ra đóng cửa.

p.s. Bạn có thể log an enhancement with ColdFusion để làm cho phạm vi này rõ ràng.

Ví dụ về các phạm vi khác nhau như sau. Chạy điều này và bạn sẽ hiểu cách đóng cửa sẽ sử dụng phạm vi differnt.

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

Bạn có thể vui lòng cung cấp một ví dụ mã hoàn chỉnh hơn, sau đó chọn nhãn mà var thuộc mà phạm vi? và với những gì var có sẵn tại thời điểm tạo ra đóng cửa? Có thể một bài đăng trên blog về chủ đề này? Nó trở nên khó hiểu. Cảm ơn bạn. – Henry

+0

ER đã được gửi: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

+1

@ Ví dụ không phù hợp trong nhận xét vì vậy tôi đang đặt câu trả lời riêng cho điều đó –

2

Yeah, như xa như tôi có thể nói, người ta không thể chỉ định một phạm vi cho các đối số chức năng của cha mẹ, vì vậy lập luận của việc đóng cửa của bạn cần phải có tên khác nhau. Những gì bạn sẽ cần phải làm là phải có một biến trung gian trong hàm phụ huynh, với một cái tên khác:

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

Đây là ít hơn lý tưởng: một phải để có thể tham khảo phạm vi lập luận của cha mẹ trong một thời trang scoped, không chỉ đơn giản là yêu cầu CF để săn lùng xung quanh cho một trận đấu.

Tôi muốn raise a bug with Adobe nếu tôi là bạn.

+0

ER nộp: https://bugbase.adobe.com/index.cfm?event=bug&id=3191742 – Henry

Các vấn đề liên quan