2009-03-10 30 views
10

Tôi có một chức năng nhưJavascript: chức năng quay trở lại với các đối số được xác định trước

function a (p1, p2) { /* ... */ } 

và trong một số phạm vi muốn để có được một cái gì đó như thế này:

function b (/* no params! */) { return a (my1, my2) } 

nơi my1 và MY2 được định nghĩa bằng cách nào đó trong phạm vi này . Vì vậy, tôi sẽ nhận được một chức năng parameterless b, mà khi được gọi là một cuộc gọi với các tham số cố định my1 và my2. Bây giờ, câu hỏi là, tại sao điều này là không đúng, và đó là :)

UPD: Ok, tôi đã có một số callbacks trong các params, bây giờ phát hiện ra, làm thế nào để xử lý tất cả. Những gì tôi bỏ qua là áp dụng kỹ thuật hai lần. Cảm ơn bạn.

Trả lời

15

Chỉ cần chắc một hàm trả về một chức năng mới b:

function getB(my1, my2) { 
    return function() { 
    a(my1, my2); 
    } 
} 

và sử dụng nó như sau:

var b = getB(my1, my2); 
0

Đặt các giá trị trong một mảng (hoặc JSON) và trả về mảng.

function a (p1,p2) { 
    var my = [] 
    my[0] = p1 
    my[1] = p2 
    return my 
} 

function b() { 
    return a(my1,nmy2) 
} 

Có thể tôi thiếu điểm trong ví dụ của bạn, tôi không biết.

+0

Dường như với tôi rằng bạn đã sai cho tôi (hoặc có thể tôi không đủ nghiêm ngặt). Điều tôi muốn là - có một hàm1, có một số tham số, để tạo hàm2, không có tham số và trả về hàm1 với một số tham số cố định, không liên tục, chắc chắn, chúng phải được đánh giá tại thời điểm đó – stanch

1

Tại sao điều này không đúng? bạn đang nhận được một lỗi? Tôi cố gắng để tái tạo một mẫu làm việc dựa trên một mô tả của bạn và những gì tôi có tác phẩm vì vậy có lẽ bạn có thể gửi một mẫu chi tiết hơn:

<script> 

function a(p1, p2) 
{ 
return 'hello ' + p1 + ' and ' + p2; 
} 
function b(my1,my2) 
{ 
return function() 
     { 
      return a(my1,my2); 
     } 
} 

var wrapper=b(); 
alert(wrapper()); 
</script> 

Sửa

Dựa trên nhận xét của bạn đến một câu trả lời tôi cập nhật mẫu của tôi để cho thấy cách bạn có thể bọc một hàm.

Sửa 2

Ok vì vậy tôi thay thế chúng với các biến ;-)

+0

vấn đề là - my1 và my2 không phải là hằng số như trong ví dụ 'josh' và 'fred' của bạn. Phải được đánh giá tại thời điểm tạo b. ví dụ: 'var v = 'một số văn bản'; function b() {return a (v);} ' – stanch

2

Viết một hàm mang theo my1 và MY2 và tạo ra chức năng b:

function make_b(my1, my2){ 
    return function b(){ return a(my1, my2);}; 
} 
1

Tôi không chắc chắn nếu tôi hiểu bạn một cách chính xác, nhưng bạn có thể xem một khái niệm gọi là currying. Có thể curry một chức năng trong Javascript như vậy mà bạn có thể có được một chức năng với một số hoặc tất cả các thông số cài sẵn.

Bạn có thể xem triển khai here.

Nếu bạn đang sử dụng Prototype, bạn có thể lấy hàm b theo cách này.

var b = a.curry(arg1, arg2); 

bây giờ gọi b() cũng giống như gọi a(arg1, arg2)

0

Có vẻ như là ba phần:

Xác định a:

function a(M, N) { 
    return M + N; 
    } 

Xác định b:

var X = 10; 
    var Y = 25; 
    var b = function() { 
    return a(X, Y); 
} 

Sử dụng b:

var thirtyFive = b(); // thirtyFive = 35 
0

Ví dụ này sử dụng sự phân công của một onclick xử lý sự kiện trong tải trang để chứng minh làm thế nào để tạo ra một tài liệu tham khảo chức năng chứa tài liệu tham khảo để nhúng giá trị sau đó địa phương trong hàm thiết lập. chỉ

<html> 
<head> 
<title>Scope passing Test</title> 
<script type="text/javascript"> 
// Your target function 
function a(p1,p2) { alert("p1="+p1+ " p2="+p2); } 


function yourSetupFunction() 
    { 
// Declare some local variables that your "a()" function cannot see to test. 
var my1 ="Look Ma" ; 
var my2 ="No hands" ; 

// Snag a reference to the <a id="testA"></a> element 
var oAelement=document.getElementById("testA"); 

oAelement.addEventListener("click"  , 
       (function(scopePass_My1,scopePass_My2) 
         { 
         return function() 
          { 
          a(scopePass_My1,scopePass_My2) 
          } 
       })(my1,my2) ,true); 
    } 
</script> 
</head> 
<body onload="yourSetupFunction()"> 
<a id="testA" href="#" onclick="return false;">Click to Test</a> 
</body> 
</html> 

Sự kỳ diệu thực tế là một vài dòng

(function(scopePass_My1,scopePass_My2) 
      { 
      return function() 
      { 
       a(scopePass_My1,scopePass_My2) 
      } 
    })(my1,my2) 

Tập đầu tiên của Parens gây ra nội dung cần đánh giá để tham khảo chức năng.

Bộ thứ hai của các dấu ngoặc ... (my1, my2) ... khiến tham chiếu hàm được gọi là trả về tham chiếu hàm khác có thể xem tham số được chuyển trong ... scopePass_My1, scopePass_My2 ... và có thể chuyển chúng đến hàm mục tiêu của bạn a (p1, p2)

Hy vọng điều đó sẽ hữu ích.

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