2010-02-10 39 views
5

Tôi thường xuyên phải liên kết? một số hàm yêu cầu đối số. Giải pháp tôi sử dụng là gói hàm để liên kết bên trong một hàm ẩn danh.Javascript ngăn chặn chức năng ẩn danh?

function foo(arg_0) { 
    // do stuff with: arg_0 
} 

function bar() { 
    var abc; 
    // stuff happens 
    abc = 'some value'; 
    attachEventHandler(elementId, 'click', function(){foo(abc);}); 
} 
bar(); 

Có cách nào thanh lịch hơn để thực hiện việc này không?

+0

cú pháp của bạn là sai; bạn có nghĩa là 'hàm() {foo (abc); }) ' – SLaks

+0

Cảm ơn, đã thay đổi – Jacco

Trả lời

10

Bạn có thể làm cho một curryer, như thế này:

function curry(func) { 
    var functionArgs = Array.prototype.slice.call(arguments, 1); 
    return function() { return func.apply(this, functionArgs); }; 
} 

Cách sử dụng:

attachEventHandler(elementId, 'click', curry(foo, abc)); 

Hoặc:

Function.prototype.curry = function() { 
    var func = this, functionArgs = arguments; 
    return function() { return func.apply(this, functionArgs); }; 
} 

Cách sử dụng:

attachEventHandler(elementId, 'click', foo.curry(abc)); 
+2

ý tưởng tuyệt vời, cảm ơn +1 –

+0

Nếu nó được đánh vần không? – SLaks

+0

Tôi chưa bao giờ nghĩ JavaScript sẽ bắt đầu làm tôi đói ... –

-2

bạn thậm chí có thể muốn đi xem xét một số js libs

ví dụ YUI

những gì bạn làm

YUI().use('node',function(Y){ 
    Y.one("#elementID").on('click', function(){ 
    // do your stuff here 
    }); 
}); 
+0

Điều này không trả lời được câu hỏi. – SLaks

1

Đó là tốt. Những gì bạn có về cơ bản là sử dụng một callback hoặc "đại biểu".

Máy sấy cà phê của SLaks là một số đường cú pháp đẹp nếu bạn phải thực hiện điều này thường xuyên trong một tập lệnh.

0

Vì vậy, trong mã của bạn, bạn có chức năng foo() có sự kiện làm đối số? Nếu đó là tất cả các bạn muốn làm sau đó attachEventHandler của bạn() có thể được viết giống như:

attachEventHandler(elementId, 'click', foo); 

gì đang xảy ra ở đó là thay vì foo gọi() nó đi qua một tài liệu tham khảo để foo().

Điều này gần hơn với suy nghĩ của bạn?

+0

Ông dường như đang cố gắng để curry tham số; Tôi tin rằng tham số 'abc' trong phương thức nặc danh của anh ta chỉ ở đó do nhầm lẫn. – SLaks

1

Bạn có thể ẩn chức năng từ nếu bạn thích 'cà ri', nhưng phương pháp gốc của bạn thực hiện điều tương tự mà không phải trả phí.

Bạn không cần đối số trong ngoặc đơn trong function- nặc danh nó vẫn còn trong phạm vi khi bạn xác định nó-

abc = 'some value'; 
attachEventHandler(elementId, 'click', function(abc){foo(abc);}) 
could be: 
attachEventHandler(elementId, 'click', function(){foo(abc)}); 
+0

Thực ra, việc đặt đối số trong dấu ngoặc đơn không giống nhau.Mã ban đầu của anh ta (trước khi anh ta chỉnh sửa câu hỏi) sẽ chuyển đối tượng sự kiện được trao cho hàm ẩn danh tới 'foo'. – SLaks

+0

Câu hỏi này không phải là về việc chuyển một sự kiện, vì vậy, trong trường hợp này câu trả lời của bạn sẽ được phát hiện. Nếu tôi đã vượt qua một sự kiện, giải pháp đầu tiên sẽ khác với giải pháp thứ hai. – Jacco

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