Truyền tham số trong hàm setInterval


320

Xin tư vấn cách truyền tham số vào một hàm gọi là sử dụng setInterval.

Ví dụ của tôi setInterval(funca(10,3), 500);là không chính xác.


2
Cú pháp:.setInterval(func, delay[, param1, param2, ...]);
O-9 ngày 9

Câu trả lời:


543

Bạn cần tạo một hàm ẩn danh để chức năng thực tế không được thực thi ngay lập tức.

setInterval( function() { funca(10,3); }, 500 );

4
Nên làm gì cho tham số động?
rony36

28
@ rony36 - bạn có thể muốn có một chức năng tạo bộ đếm thời gian cho bạn. Truyền tham số cho hàm để giá trị của nó được ghi lại trong bao đóng hàm và được giữ lại khi hết thời gian. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }Sau đó gọi nó là createInterval(funca,dynamicValue,500); Rõ ràng bạn có thể mở rộng điều này cho nhiều hơn một tham số. Và, xin vui lòng, sử dụng tên biến mô tả nhiều hơn. :)
tvanfosson

@tvanfosson: câu trả lời tuyệt vời! Bạn có biết làm thế nào để xóa các hình thức khoảng trong chức năng funca?
Flo

@tvanfosson Cảm ơn. Xấu của tôi, nhưng tôi thực sự có nghĩa là ví dụ tạoInterval bạn đã đưa ra trong phần bình luận. Làm thế nào nó sẽ làm việc cho điều đó? Tôi đã nghĩ đến việc chuyển một biến hẹn giờ như một tham số động, nhưng không chắc chắn làm thế nào hoặc nếu điều đó có ý nghĩa. Vì lợi ích của sự rõ ràng, tôi đã thêm một câu hỏi mới ở đây: stackoverflow.com/questions
Flo

78

bây giờ với ES5, phương thức liên kết Nguyên mẫu hàm:

setInterval(funca.bind(null,10,3),500);

Tham khảo tại đây


2
Đây là câu trả lời tốt nhất, tuy nhiên nó có thể có hành vi bất ngờ tùy thuộc vào chức năng. ví dụ console.log.bind(null)("Log me")sẽ ném Illegal invocation, nhưng console.log.bind(console)("Log me")sẽ làm việc như mong đợi. Điều này là do console.logyêu cầu consolenhư các thisarg.
Indy

1
Cho đến nay câu trả lời tốt nhất. Lean và sạch sẽ. Cảm ơn rất nhiều!
Tobi

Rất sạch sẽ và hiệu quả!
contactmatt

2
Chỉ cần thêm hoạt động với Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (Nguồn: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/ tựa )
Roger Veciana

60

Thêm chúng làm tham số cho setInterval:

setInterval(funca, 500, 10, 3);

Cú pháp trong câu hỏi của bạn sử dụng eval, không được khuyến khích thực hành.


2
Ai vậy?! Từ khi nào được phép? (câu hỏi nghiêm túc)
Lưỡi liềm tươi

1
Không chắc. Nguồn của tôi là: developer.mozilla.org/en/DOM/window.setInterval
Kev

2
@Kev Internet Explorer là một mớ hỗn độn thực sự Nó không hỗ trợ truyền các đối số -.-
ShrekOverflow

1
IMHO đây sẽ là câu trả lời được chấp nhận. Giải pháp đẹp, đơn giản và sạch sẽ.
Lightman

32

Bạn có thể truyền (các) tham số làm thuộc tính của đối tượng hàm, không phải là tham số:

var f = this.someFunction;  //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);

Sau đó, trong chức năng của bạn someFunction, bạn sẽ có quyền truy cập vào các tham số. Điều này đặc biệt hữu ích bên trong các lớp nơi phạm vi tự động đi vào không gian toàn cầu và bạn mất các tham chiếu đến lớp được gọi là setInterval để bắt đầu. Với cách tiếp cận này, "tham số2" trong "someFunction", trong ví dụ trên, sẽ có phạm vi phù hợp.


1
Bạn có thể truy cập bằng
Classname.prototype.someFunction.parameter1

2
Việc thêm tham số vào một đối tượng hoặc hàm có thể khiến trình biên dịch chậm lại vì nó sẽ phải xây dựng lại biểu diễn mã gốc của đối tượng (ví dụ nếu điều này được thực hiện trong một vòng lặp nóng), vì vậy hãy cẩn thận.
mattdlockyer

22
     setInterval(function(a,b,c){

          console.log(a + b +c);  

      }, 500, 1,2,3);

           //note the console will  print 6
          //here we are passing 1,2,3 for a,b,c arguments
         // tested in node v 8.11 and chrome 69

Giải thích tốt nhất câu trả lời.
Drk_alien

Vậy tại sao lại vượt qua các đối số dưới dạng mảng? Chi tiết này thậm chí không liên quan đến câu hỏi.
dùng4642212

18

Bạn có thể sử dụng một chức năng ẩn danh;

setInterval(function() { funca(10,3); },500);

1
Đây là một cuộc gọi khá tốn kém!
Roy Lee

2
@Roylee Nó đắt thế nào?
dùng4642212

18
setInterval(function,milliseconds,param1,param2,...)

Cập nhật: 2018 - sử dụng toán tử "lây lan"

function repeater(param1, param2, param3){
   alert(param1);
   alert(param2);
   alert(param3); 
}

let input = [1,2,3];
setInterval(repeater,3000,...input);


Đây là cách tốt hơn.
Ugur Kazdal

Đây là cách tốt hơn.
Ugur Kazdal

11

Cho đến nay, câu trả lời thiết thực nhất là câu trả lời của tvanfosson, tất cả những gì tôi có thể làm là cung cấp cho bạn phiên bản cập nhật với ES6:

setInterval( ()=>{ funca(10,3); }, 500);

1
Bạn có nói rằng () => {} là cách mới của ES6 để thay thế hàm () {}? Hấp dẫn. Đầu tiên, tôi nghĩ tên lửa là passe. Và, trừ khi cú pháp này có những cách sử dụng phổ biến khác, nó chỉ là rất, rất kỳ quặc. Tôi thấy họ là "mũi tên béo". Tuy nhiên, lẻ. Tôi đoán ai đó thích nó và đó là vấn đề quan điểm.
Richard_G

6

Trích dẫn các đối số là đủ:

OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)

KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)

Lưu ý trích dẫn duy nhất 'cho mỗi đối số.

Đã thử nghiệm với IE8, Chrome và FireFox


7
Sử dụng eval là một thực hành khủng khiếp. Việc sử dụng chức năng ẩn danh là cách tốt hơn.
SuperIRis

1

Tôi biết chủ đề này rất cũ nhưng đây là giải pháp của tôi về việc truyền tham số trong setIntervalhàm.

Html:

var fiveMinutes = 60 * 2;
var display = document.querySelector('#timer');
startTimer(fiveMinutes, display);

JavaScript:

function startTimer(duration, display) {
    var timer = duration,
        minutes, seconds;

    setInterval(function () {
        minutes = parseInt(timer / 60, 10);
        seconds = parseInt(timer % 60, 10);

        minutes = minutes < 10 ? "0" + minutes : minutes;
        seconds = seconds < 10 ? "0" + seconds : seconds;

        display.textContent = minutes + ":" + seconds;
        --timer; // put boolean value for minus values.

    }, 1000);
}

Tôi cần truy cập một giá trị một lần khi gọi hàm, nhưng không phải mỗi giây, vì vậy câu trả lời của bạn cung cấp điều này, (ví dụ timer), nhưng làm thế nào để bạn clearInterval()trong kịch bản này?
dùng1063287

0

Điều này hoạt động setInterval("foo(bar)",int,lang);.... Jon Kleiser dẫn tôi đến câu trả lời.


0

Một giải pháp khác bao gồm vượt qua chức năng của bạn như thế (nếu bạn có vars động): setInterval ('funca (' + x + ',' + y + ')', 500);


0

Bạn có thể sử dụng một thư viện được gọi là js gạch dưới. Nó cung cấp một trình bao bọc đẹp cho phương thức liên kết và cũng là một cú pháp gọn gàng hơn nhiều. Để bạn thực hiện chức năng trong phạm vi được chỉ định.

http://underscorejs.org/#bind

_.bind (hàm, phạm vi, * đối số)


0

Vấn đề đó sẽ là một minh chứng tốt đẹp cho việc sử dụng các bao đóng. Ý tưởng là một hàm sử dụng một biến có phạm vi bên ngoài. Đây là một ví dụ...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

ret = function(){
    console.log("Hello, " + name);
}

return ret;
}

Hàm "makeClences" trả về một hàm khác, có quyền truy cập vào "tên" biến phạm vi bên ngoài. Vì vậy, về cơ bản, bạn cần truyền vào bất kỳ biến nào cho hàm "makeClenses" và sử dụng chúng trong hàm được gán cho biến "ret". Ảnh hưởng, setInterval sẽ thực thi chức năng được gán cho "ret".


0

Tôi đã có cùng một vấn đề với ứng dụng Vue. Trong trường hợp của tôi, giải pháp này chỉ hoạt động nếu chức năng ẩn danh đã khai báo là chức năng mũi tên, liên quan đến khai báo tại mounted ()móc vòng đời.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.