2012-03-22 38 views
17

Rất thường xuyên, tôi thấy mình đang sử dụng hàm gọi lại và tôi không có tài liệu hữu ích, và sẽ rất thú vị khi xem tất cả các đối số được chuyển đến chức năng gọi lại đó.Làm thế nào để có được tất cả đối số của hàm gọi lại

// callback is a function that I don't know the args for... 
// and lets say it was defined to be used like: callback(name, number, value) 
something.doSomething(callback); 

Làm cách nào tôi có thể xác định những gì mà nó truyền vào điều đó?

Lưu ý: nhìn vào mã nguồn có thể vô ích khi mã bản thân là obfuscated và minified (như nhiều js framework là)

+4

'đối số' http://javascriptweblog.wordpress.com/2011/01/18/javascripts-arguments-object-and-beyond/ – asawyer

+1

thông số phải được xác định bởi callee, không phải người gọi? – jbabey

+0

Bạn thường có thể xem mã nguồn cho chức năng gọi ngay cả khi bạn không có tài liệu hữu ích. – hugomg

Trả lời

26

Để có được danh sách các đối số mà không vi phạm chức năng, ghi đè lên các chức năng gọi lại theo cách này:

var original = callback; 
callback = function() { 
    // Do something with arguments: 
    console.log(arguments); 
    return original.apply(this, arguments); 
}; 
  1. Bối cảnh, this được bảo tồn.
  2. Tất cả đối số được truyền chính xác.
  3. Giá trị trả lại được chuyển chính xác.

LƯU Ý: Phương pháp này hoạt động trong hầu hết các trường hợp. Mặc dù có những trường hợp cạnh nơi phương pháp này sẽ thất bại, bao gồm:

  • thuộc tính Read-only (ví dụ định nghĩa sử dụng Object.defineProperty với writable:false)
  • Thuộc tính được định nghĩa sử dụng getters/setters, khi getter/setter không phải là đối xứng.
  • Đối tượng lưu trữ và plugin plugin: Ví dụ: Flash và ActiveX.
+1

PS. Để biết thêm chi tiết, hãy thêm ['console.trace();'] (https://developer.mozilla.org/en/DOM/console.trace) vào hàm gọi lại được thay thế. –

+1

Tại sao 'return original.apply (điều này, đối số);' là không đủ? – gdoron

+0

@gdoron Một số trình duyệt ném lỗi khi '.apply (, )' được sử dụng. Xem thêm: [MDN: 'Function.apply'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply#Parameters). Đối số ['arguments'] (https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments) không phải là mảng thực. –

8

Nó có thể được dễ dàng như

function callback() { 
    console.log(arguments); 
} 

?

Mọi chức năng đều cung cấp các đối số mà nó đã được gọi trong bộ sưu tập tự động arguments.

+0

Anh ấy không thể thay đổi mã gọi lại. Nếu anh ta có thể, anh ta sẽ không cần phải sử dụng các lý lẽ để biết nó là gì đối số ... – gdoron

+0

Anh ta nói điều đó ở đâu? Vì khi nào bạn không thể thay đổi mã JS?Ngoài ra, một trình gỡ rối JS và điểm ngắt chỉ là một vài cú nhấp chuột. – Tomalak

+0

Ông đã viết anh ta không muốn nhìn vào các tài liệu của func, do đó, chắc chắn rằng ông không có mã chức năng một cách cẩn thận ... – gdoron

1

Đây không phải là loại giỏ hàng dẫn đầu con ngựa?

Chức năng của bạn sẽ gọi lại. Đó là phương pháp sử dụng chức năng của bạn cần lưu ý về những đối số mà hàm gọi lại sẽ chấp nhận.

+3

điều đó sẽ đúng nếu nó là * chức năng * của tôi, nhưng +1 cho sử dụng tốt chữ nghiêng. haha;) – Kristian

0

Bạn thậm chí có thể nói nó có chức năng của args để có được sử dụng .arguments [functionName]:

(function(arg1, arg2, agr3){ 
    console.log('args are:', arguments); 
    return function fn(){ 
     function m(){ 
      console.log(
       'fn.arguments:', fn.arguments, 
       'm.arguments:', m.arguments, 
       'argumentsX:', arguments 
      ); 
     }; 
     m('mArg1', 'mArg2', 'mArg3', 'mArg4'); 
    }; 
}) 
(1, 2, Math.PI) // invoke closure 
('fnArg1', 'fnArg2', 'fnArg3', 'fnArg4'); // invoke "fn" 

Mỗi chức năng def viết lại các đối số từ khóa là phạm vi mà btw (như đã thấy với "argumentsX" đăng nhập).

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