2011-09-04 37 views
15

thể trùng lặp:
Is it possible to send a variable number of arguments to a JavaScript function?Đi qua số biến của tham số từ một chức năng khác

tôi có thể sử dụng arguments để có được một số biến của tham số trong một chức năng, nhưng làm thế nào tôi có thể chuyển chúng đến một chức năng khác mà không biết nguyên mẫu của nó?

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f) { f(arguments); } // not correct, what to do? 
run(show, 'foo', 'bar'); 

Lưu ý: Tôi không thể đảm bảo số lượng các đối số cần thiết cho các chức năng f được truyền cho run. Có nghĩa là, mặc dù ví dụ thể hiện có 2 đối số, nó có thể là 0-vô hạn, vì vậy sau đây là không thích hợp:

function run(f) { f(arguments[1], arguments[2]); } 
+0

Tôi không đồng ý này, vì bạn có thể thấy, 'show' đã xác định lập luận, nó không sử dụng' arguments'. Tôi đã thử 'áp dụng 'theo cách đó mà không có may mắn. – steveo225

+0

Vâng, như bạn đã nhận thấy bây giờ, 'áp dụng' là cách duy nhất để làm điều này, do đó nó * là * một bản sao. –

+0

Có, ngoại trừ cách 'đối số' được sử dụng hoàn toàn khác và cuối cùng là điểm của câu hỏi. – steveo225

Trả lời

26

Cách chính để truyền một bộ đối số được tạo lập trình tới hàm là sử dụng phương thức 'áp dụng' của hàm.

function show(foo, bar) { 
    window.alert(foo+' '+bar); 
} 
function run(f) { 
    // use splice to get all the arguments after 'f' 
    var args = Array.prototype.splice.call(arguments, 1); 
    f.apply(null, args); 
} 

run(show, 'foo', 'bar'); 
+0

Đối với áp phích, nếu hàm là một phương thức đối tượng và cần giữ ngữ cảnh của nó, hãy chuyển đối tượng 'this' này thay vì' null' bằng 'f.apply (this, args);'. – tmthydvnprt

1

bạn cần phải sử dụng chức năng áp dụng .. đây là cách u làm điều đó :

function variableFunction1() 
    { 

    alert("variableFunction1 arguments length: " + arguments.length); 

    // calls second varargs function keeping current 'this'. 
    variableFunction2.apply(this, arguments); 
} 

function variableFunction2() 
{ 

    alert("variableFunction2 arguments length: " + arguments.length); 
} 

variableFunction1('a','b','c'); 

Demo

6

bạn có thể trên thực tế làm điều này với áp dụng, nếu tôi hiểu câu hỏi của bạn một cách chính xác:

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f, args) { f.apply(null,args); } 
run(show, ['foo', 'bar']); 
+0

Vấn đề với điều đó, tôi đã có một thiết lập khuôn khổ bằng cách sử dụng 'đối số' và không muốn chuyển đổi tất cả các cuộc gọi để sử dụng mảng. Cũng vậy, tôi có thể thử chuyển đổi 'đối số' từ một đối tượng thành một mảng và chuyển nó. – steveo225

+0

Hãy xem giải pháp từ @Logan sau đó, có vẻ như nó sẽ làm những gì bạn cần. – spike

0

Trong ví dụ của bạn để vượt qua đối số biến để hiển thị các công trình

function show(foo, bar) { window.alert(foo+' '+bar); } 
function run(f) { f.apply(null, Array().slice.call(arguments, 1)); } 
run(show, 'foo', 'bar'); 
Các vấn đề liên quan