2012-05-03 40 views
6

Những gì tôi muốn làm là như sau:python trang trí với javascript

Tôi có một chức năng cảnh báo điều gì đó:

myfunction = function(foobar) { 
       alert(foobar); 
      }; 

Bây giờ tôi muốn để trang trí nó để:

decorate = function(callback) { 
       return function(foobar) { 
        callback(foobar); 
        console.log(foobar); 
      }; 
}; 

Vì vậy, sau đó tôi có thể viết:

myfunction = decorate(myfunction); 

Và sau đó chức năng của tôi sẽ làm bình thường + đăng nhập trong giao diện điều khiển.

Tôi làm cách nào để nó hoạt động với Javascript?

+2

Trên thực tế nó không làm việc như – Natim

Trả lời

10

Có, bạn có thể. Và trên thực tế, bạn có, triển khai của bạn hoạt động hoàn hảo: Live example | source

var myfunction = function(foobar) { alert(foobar); }; 

var decorate = function(callback) { return function(foobar) { callback(foobar); console.log(foobar); }; }; 

var result = decorate(myfunction); 

result("Hi there"); 

tôi sẽ khuyên bạn sử dụng chức năng tờ khai chứ không phải là chức năng biểu, mặc dù:

function myfunction(foobar) { 
    alert(foobar); 
} 

function decorate(callback) { 
    return function(foobar) { 
     callback(foobar); 
     console.log(foobar); 
    }; 
} 

var result = decorate(myfunction); 

result("Hi there"); 

Và nếu bạn muốn tạo ra một phiên bản chung chung hơn, nhìn vào sử dụng apply (MDN | spec) và arguments giả mảng (MDN | spec): Live example | source

function decorate(original, wrapper, context) { 
    return function() { 
     try { 
      original.apply(this, arguments); 
     } 
     catch (e) { 
     } 
     try { 
      wrapper.apply(context || this, arguments); 
     } 
     catch (e) { 
     } 
    }; 
} 

function myFunction(arg1, arg2) { 
    alert("arg1 = " + arg1 + ", arg2 = " + arg2); 
} 

var newFunction = decorate(myFunction, function(arg1, arg2) { 
    console.log("arg1 = " + arg1 + ", arg2 = " + arg2); 
}); 

newFunction(1, 2); 

Đó là phiên bản làm một vài điều:

  1. Cho phép bạn cung cấp gọi lại như một cuộc tranh cãi với một trung tâm decorate chức năng.

  2. Cho phép bạn tùy chọn cung cấp "ngữ cảnh" (this giá trị) để sử dụng khi gọi lại gọi lại.

  3. Bảo toàn giá trị this khi gọi cả bản gốc và (nếu bạn không cung cấp context) gọi lại.

... có ích khi trang trí các chức năng đối tượng (đôi khi được gọi là phương pháp).

+0

này, tôi thường sử dụng khai báo hàm nhưng trong trường hợp đó các chức năng được định nghĩa trong một mảng (nó là dành cho statusCode trong $ .ajax ()). Tôi rất vui khi thấy một phiên bản chung. – Natim

+0

@Natim: Rất tò mò, tôi vừa thêm vào. :-) –

+0

Điều đôi khi trình bao bọc có thể gọi trước khi gọi lại và đôi khi sau. Nhưng việc triển khai của bạn thật thú vị. – Natim

2

More generic sử dụng lập luận và áp dụng:

function myfunction(foobar) { 
    alert(foobar); 
} 

function decorate(callback) { 
    return function() { 
     callback.apply(null, arguments); 
     console.log(arguments); 
    }; 
} 

var result = decorate(myfunction); 

result("Hi there"); 
Các vấn đề liên quan