2009-01-19 73 views

Trả lời

436

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); 
+3

điều gì cần cho tham số động? – rony36

+21

@ rony36 - bạn có thể muốn có một chức năng tạo bộ đếm thời gian cho bạn. Vượt qua tham số cho hàm để giá trị của nó được ghi lại trong chức năng đóng và 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 nó cho nhiều hơn một tham số. Và, vui lòng, sử dụng các tên biến mô tả hơn. :) – tvanfosson

+2

@tvanfosson - Làm cách nào để xóa khoảng thời gian này? – Yong

34

Thêm chúng như các tham số để setInterval:

setInterval(funca, 500, 10, 3); 

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

+6

Điều này sẽ không hoạt động trên Internet Explorer. – Kev

+1

Whaa ?! Kể từ khi được cho phép? (câu hỏi nghiêm túc) –

+1

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

16

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

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

đây là một cuộc gọi khá đắt! – Roylee

+0

@Roylee Nó đắt thế nào? – Xufox

0

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

29

Bạn có thể vượt qua các tham số (s) như một thuộc tính của đối tượng chức năng, không phải là một 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 thông số. Điều này đặc biệt hữu ích bên trong các lớp mà phạm vi đi vào không gian toàn cầu tự động và bạn mất tham chiếu đến lớp được gọi là setInterval để bắt đầu. Với phương pháp này, "parameter2" trong "someFunction", trong ví dụ trên, sẽ có phạm vi phù hợp.

+0

Bạn có thể truy cập theo Classname.prototype.someFunction.parameter1 – JoaquinG

+2

Việc thêm tham số vào đối tượng hoặc hàm có thể làm cho 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 nóng vòng lặp) vì vậy hãy cẩn thận. – mattdlockyer

5

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 ý các dấu nháy đơn ' cho mỗi đối số.

Thử nghiệm với IE8, Chrome và FireFox

+6

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

56

bây giờ với ES5, ràng buộc phương pháp hàm nguyên mẫu:

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

Reference here

+1

Đây là câu trả lời hay nhất, tuy nhiên nó có thể có hành vi không mong muốn tùy thuộc vào chức năng. ví dụ. '' console.log.bind (null) ("Log me") '' sẽ ném '' Invocation bất hợp pháp'', nhưng '' console.log.bind (console) ("Log me") '' sẽ hoạt động như mong đợi . Điều này là do '' console.log'' yêu cầu '' console'' là '' this'' arg. – Indy

+1

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

+0

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

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

      console.log(a + b +c); 

     }, 500, [1],[2],[3]); 

      //note the console will not print 6 
      // rather it will print 123 in every 500 ms 
      // because arguments are passed as array not as numbers 
      // tested in node.js ie 11 and chrome 
+0

Câu trả lời được giải thích tốt nhất. –

+0

Vậy tại sao truyền đối số thành mảng? Chi tiết này thậm chí không liên quan đến câu hỏi. – Xufox

0

Một giải pháp khác bao gồm trong 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);

-1

Bạn có thể sử dụng thư viện có tên là gạch dưới js. Nó cung cấp một wrapper đẹp trên phương thức bind và cũng là một cú pháp sạch hơn. Cho phép bạn thực thi hàm trong phạm vi được chỉ định.

http://underscorejs.org/#bind

_.bind (chức năng, phạm vi, đối số *)

10
setInterval(function,milliseconds,param1,param2,...) 
-2

parenthesizes Thêm chức năng ẩn danh sau dường như làm các trick:

function clock() { 
    n = 10; 

    while(--n) { 
     setInterval(function() { 
      console.log(n); 
     }(n), 1000); 
    } 
} 
+1

Mã của bạn sẽ chỉ chạy hàm nhưng nó sẽ không áp dụng độ trễ cho nó, bạn có thể xóa các dòng xung quanh 'console.log (n)' và bạn sẽ có kết quả tương tự. –

0

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

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); 
} 
9

Cho đến nay câu trả lời thiết thực nhất là người do tvanfosson, tất cả tôi có thể làm là cung cấp cho bạn một 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ĩ rằng tên lửa đã được passe. Và, trừ khi cú pháp này có sử dụng phổ biến khác, nó chỉ rất, rất kỳ quặc. Tôi thấy chúng là "mũi tên béo". Tuy nhiên, kỳ quặc. Tôi đoán ai đó thích nó và đó là vấn đề của ý kiến. –

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