ผ่านพารามิเตอร์ในฟังก์ชัน setInterval


320

setIntervalโปรดให้คำแนะนำวิธีการส่งผ่านพารามิเตอร์ในการทำงานที่เรียกว่าใช้

ตัวอย่างของฉันsetInterval(funca(10,3), 500);ไม่ถูกต้อง


2
ไวยากรณ์:.setInterval(func, delay[, param1, param2, ...]);
O-9

คำตอบ:


543

คุณต้องสร้างฟังก์ชั่นที่ไม่ระบุตัวตนเพื่อที่จะไม่ได้ใช้งานฟังก์ชันได้ทันที

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

4
สิ่งที่ควรสำหรับพารามิเตอร์แบบไดนามิก?
rony36

28
@ rony36 - คุณอาจต้องการฟังก์ชั่นที่สร้างตัวจับเวลาช่วงเวลาสำหรับคุณ ส่งผ่านพารามิเตอร์ไปยังฟังก์ชันเพื่อให้ค่าถูกจับในการปิดฟังก์ชันและเก็บไว้เมื่อหมดเวลา function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }จากนั้นเรียกว่าเป็นcreateInterval(funca,dynamicValue,500); เห็นได้ชัดว่าคุณสามารถขยายได้มากกว่าหนึ่งพารามิเตอร์ และโปรดใช้ชื่อตัวแปรอธิบายเพิ่มเติม :)
tvanfosson

@tvanfosson: คำตอบที่ยอดเยี่ยม! คุณรู้วิธีล้างฟอร์มช่วงเวลาในฟังก์ชั่นfuncaหรือไม่?
Flo

@tvanfosson ขอบคุณ ไม่ดีของฉัน แต่ฉันหมายถึงตัวอย่าง createInterval ที่คุณให้ไว้ในส่วนความคิดเห็น มันจะทำงานได้อย่างไร ฉันคิดว่าการส่งตัวแปรตัวจับเวลาเป็นพารามิเตอร์แบบไดนามิกด้วย แต่ไม่แน่ใจว่าเหมาะสมหรือไม่ เพื่อความชัดเจนฉันได้เพิ่มคำถามใหม่ที่นี่: stackoverflow.com/questions/40414792/…
Flo

78

ขณะนี้มี ES5 วิธีการผูกฟังก์ชั่นต้นแบบ:

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

อ้างอิงที่นี่


2
นี่เป็นคำตอบที่ดีที่สุดอย่างไรก็ตามอาจมีพฤติกรรมที่ไม่คาดคิดขึ้นอยู่กับฟังก์ชั่น เช่นconsole.log.bind(null)("Log me")จะโยนIllegal invocationแต่console.log.bind(console)("Log me")จะทำงานตามที่คาดไว้ นี่เป็นเพราะconsole.logต้องการconsoleเป็นthisอาร์กิวเมนต์
Indy

1
โดยคำตอบที่ดีที่สุด โน้มตัวและสะอาด ขอบคุณมาก!
Tobi

สะอาดและมีประสิทธิภาพมาก!
contactmatt

2
เพียงเพิ่มที่ใช้งานได้กับ Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (ที่มา: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/ ...... )
Roger Veciana

60

เพิ่มเป็นพารามิเตอร์เพื่อ setInterval:

setInterval(funca, 500, 10, 3);

ไวยากรณ์ในคำถามของคุณใช้ eval ซึ่งไม่แนะนำให้ใช้


2
Whaa ?! ตั้งแต่เมื่อใดที่ได้รับอนุญาต (คำถามร้ายแรง)
Crescent Fresh

1
ไม่แน่ใจ. แหล่งที่มาของฉันคือ: developer.mozilla.org/en/DOM/window.setInterval
Kev

2
@Kev Internet Explorer เป็นระเบียบจริงมันไม่รองรับการส่งผ่านข้อโต้แย้ง -.
ShrekOverflow

1
IMHO นี่ควรเป็นคำตอบที่ยอมรับได้ ทางออกที่ดีเรียบง่ายและสะอาดตา
LightMan

32

คุณสามารถส่งผ่านพารามิเตอร์เป็นคุณสมบัติของฟังก์ชันวัตถุไม่ใช่พารามิเตอร์:

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

จากนั้นในฟังก์ชั่นของsomeFunctionคุณคุณจะสามารถเข้าถึงพารามิเตอร์ สิ่งนี้มีประโยชน์อย่างยิ่งภายในคลาสที่ขอบเขตไปที่พื้นที่ส่วนกลางโดยอัตโนมัติและคุณจะสูญเสียการอ้างอิงไปยังคลาสที่เรียกว่า setInterval เพื่อเริ่มต้นด้วย ด้วยวิธีการนี้ "parameter2" ใน "someFunction" ในตัวอย่างข้างต้นจะมีขอบเขตที่เหมาะสม


1
คุณสามารถเข้าถึงได้โดย Classname.prototype.someFunction.parameter1
JoaquinG

2
การเพิ่มพารามิเตอร์ให้กับวัตถุหรือฟังก์ชั่นสามารถทำให้คอมไพเลอร์ช้าลงเนื่องจากมันจะต้องสร้างมันเป็นตัวแทนรหัสพื้นเมืองของวัตถุ (เช่นถ้าทำในวงร้อน) ดังนั้นระวัง
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

คำตอบที่ดีที่สุดอธิบาย
Drk_alien

ดังนั้นผ่านอาร์กิวเมนต์เป็นอาร์เรย์ทำไม รายละเอียดนี้ไม่ได้เกี่ยวข้องกับคำถาม
user4642212

18

คุณสามารถใช้ฟังก์ชันที่ไม่ระบุชื่อ

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

1
นี่เป็นการโทรที่ค่อนข้างแพง!
Roy Lee

2
@Roylee ราคาแพงแค่ไหน?
user4642212

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

อัปเดต: 2018 - ใช้ตัวดำเนินการ "spread"

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

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


นี่เป็นวิธีที่ดีกว่า
Ugur Kazdal

นี่เป็นวิธีที่ดีกว่า
Ugur Kazdal

11

โดยคำตอบที่เป็นประโยชน์มากที่สุดคือคำตอบของ tvanfosson สิ่งที่ฉันทำได้คือให้รุ่นที่ปรับปรุงด้วย ES6:

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

1
คุณกำลังบอกว่า () => {} เป็นวิธีใหม่ของ ES6 ในการแทนที่ฟังก์ชั่น () {}? น่าสนใจ ก่อนอื่นฉันคิดว่าจรวดผ่านไปแล้ว และเว้นแต่ว่าไวยากรณ์นี้มีการใช้งานทั่วไปอื่น ๆ มันก็แปลกมาก ฉันเห็นพวกเขาเป็น "ลูกศรอ้วน" ยังแปลก ฉันเดาว่ามีคนชอบมันและมันเป็นเรื่องของความเห็น
Richard_G

6

การอ้างถึงข้อโต้แย้งควรจะเพียงพอ:

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

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

บันทึกเครื่องหมายคำพูดเดี่ยว'สำหรับแต่ละอาร์กิวเมนต์

ทดสอบกับ IE8, Chrome และ FireFox


7
การใช้ eval เป็นการฝึกฝนที่แย่มาก การใช้ฟังก์ชั่นนิรนามนั้นดีกว่า
SuperIRis

1

ฉันรู้ว่าหัวข้อนี้เก่ามาก แต่นี่เป็นวิธีแก้ปัญหาเกี่ยวกับการส่งพารามิเตอร์มา 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);
}

ฉันต้องการเข้าถึงค่าหนึ่งครั้งเมื่อเรียกใช้ฟังก์ชัน แต่ไม่ใช่ทุกวินาทีดังนั้นคำตอบของคุณจะให้สิ่งนี้ (เช่นtimer) แต่คุณจะทำอย่างไรclearInterval()ในสถานการณ์นี้
user1063287


0

โซลูชันอื่นประกอบด้วยการส่งผ่านฟังก์ชันของคุณเช่นนั้น (หากคุณมี vars ไดนามิก): setInterval ('funca (' + x + ',' + y + ')', 500);


0

คุณสามารถใช้ไลบรารีชื่อ underscore js มันให้เสื้อคลุมที่ดีในวิธีการผูกและเป็นไวยากรณ์ที่สะอาดมากเช่นกัน ให้คุณเรียกใช้ฟังก์ชันในขอบเขตที่ระบุ

http://underscorejs.org/#bind

_.bind (ฟังก์ชันขอบเขตขอบเขต *)


0

ปัญหานั้นจะเป็นการสาธิตที่ดีสำหรับการใช้งานการปิด แนวคิดก็คือฟังก์ชั่นใช้ตัวแปรขอบเขตด้านนอก นี่คือตัวอย่าง ...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

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

return ret;
}

ฟังก์ชัน "makeClosure" ส่งคืนฟังก์ชันอื่นซึ่งมีการเข้าถึงตัวแปรชื่อขอบเขต "นอก" ดังนั้นโดยพื้นฐานแล้วคุณต้องผ่านตัวแปรใด ๆ ในฟังก์ชั่น "makeClosure" และใช้มันในฟังก์ชั่นที่กำหนดให้กับตัวแปร "ret" อย่างตั้งใจ setInterval จะใช้งานฟังก์ชั่นที่กำหนดให้กับ "ret"


0

ฉันมีปัญหาเดียวกันกับแอพ Vue ในกรณีของฉันการแก้ปัญหานี้ใช้ได้เฉพาะเมื่อฟังก์ชันที่ไม่ระบุชื่อได้ประกาศเป็นฟังก์ชันลูกศรซึ่งเกี่ยวข้องกับการประกาศที่mounted ()hook circle life

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.