1. 程式人生 > >定時器呼叫含引數的函式(參函式)

定時器呼叫含引數的函式(參函式)

  • 通常我們使用定時器來實現某種功能的時候,如下。
function numAdd(num){
     num++;
     console.log(num);
}
setInterval(numAdd,1000);
  • 由於無法傳入引數num為undefined,之後進行++運算,變成NaN。
  • 而有時候我們會這麼做
function numAdd(num){
     num++;
     console.log(num);
}
setInterval(numAdd(1),1000);
  • 但是這樣我們會發現,函式會被立即執行,因為傳入的引數為numAdd(1)為函式體並且帶著小括號(可以理解帶上小括號為執行函式)已經立馬的執行了一次了。
  • 那有時候我們某些地方需要用到引數但是又不想它立即執行該怎麼辦呢?解決辦法是在定時器的呼叫函式中重新return一個新的含參函式並返回。如下
function timer(num){
   return function numAdd(){
      num++;
     console.log(num); 
    }
}
setInterval(timer(num),300);
  • 相當於我們把需要呼叫的含參函式體再重新用一個無參函式包裹起來返回。

  • 當然還有一個取巧的方法如下:

function numAdd(num){
     num++;
     console.log(num);
}
setInterval("numAdd(1)"
,1000);

這樣把呼叫引數變成字串傳入,便不會立即執行,但是需要注意的是,當你的numAdd裡面傳入的是變數的時候,這個變數需要是全域性變數,因為函式在傳入的時候是個字串,它並沒有取到你在某個函式內的區域性變數,而當他執行的時候,它也只會在全域性找這個變數。