1. 程式人生 > >關於js函數中存在異步的情況下的變量的分析

關於js函數中存在異步的情況下的變量的分析

prop javascrip js函數 art on() col lis 記錄 use

  javascript語言是一門“單線程”的語言,不像java語言,類繼承Thread再來個thread.start就可以開辟一個線程,所以,javascript就像一條流水線,僅僅是一條流水線而已,要麽加工,要麽包裝,不能同時進行多個任務和流程。但是存在異步的情況,即使用setInterval,setTimeout,和ajax異步請求的時候。那麽在函數中存在異步的情況下變量和函數本身是什麽樣的呢?下面由一個例子入手:

例子:

(function(){
  var i=0;      //記錄banner輪播的第多少頁
  var oBtnWrapper=document.getElementById(
btnWrapper);//banner所在的div var timer=setInterval(function(){ btnListInitial(i); //實現輪播的核心函數 i++; //自動輪播的基礎,每2秒i++,並傳入核心函數 if(i===4)i=0; //輪播到第四張圖片時,馬上換回第一張 },2000) oBtnWrapper.onmouseenter=function(e){e.stopPropagation();clearInterval(timer)} oBtnWrapper.onmouseleave=function(e){e.stopPropagation();timer=timer=setInterval(function(){ btnListInitial(i); i
++; if(i===4)i=0; },2000)} }())

  上面是一個實現banner的輪播自執行函數,在這之前我並未意識到函數中的變量i可以一直存在內存中,以此來讓setInterval(function(){......})中的代碼語句:i++; //自動輪播的基礎,每2秒i++,並傳入核心函數 if(i===4)i=0;起作用,一般情況下,函數執行之後,其變量應該被回收

而不應該存在內存中;但是,但是,但是在這個函數中存在一個異步的情況(setInterval),因此在函數執行後setInterval中的函數被反復執行,setInterval中的函數的i變量來至外部的自執行函數(function()()),所以這個自執行函數一直留在內存中。

關於js函數中存在異步的情況下的變量的分析