簡單說下js閉包之setTimeout


今天寫代碼的時候發現  網頁上很多彈窗需要自動關閉

倒計時5秒之后用戶無操作就關閉了,(angular 框架),代碼如下,一:

        for(var i=5;i>0;i--){
            setTimeout((function(i){        
                return function(){
                    $scope.upstate="上傳失敗!"+(5-i)+"秒后本窗口關閉";    
                    //$scope.upclosed();    
                    //console.log($scope.upstate);
                    $scope.$apply();
                    //console.log(new Date().getTime());                    
                    if(i==5){                        
                        $scope.upclosed();            
                    }                    
                }
            })(i),i*1000);
        }

輸出結果是:

二: 稍加改動,去掉函數(),如下所示

   for(var i=5;i>0;i--){
            setTimeout(function(i){        
                return function(){
                   // $scope.upstate="上傳失敗!"+(5-i)+"秒后本窗口關閉";  
                window.upstate="上傳失敗!"+(5-i)+"秒后本窗口關閉";                    
                    //$scope.upclosed();    
                    console.log(window.upstate);
                    //$scope.$apply();
                    console.log(new Date().getTime());                    
                    if(i==5){                        
                       // $scope.upclosed();            
                    }                    
                }
            }(i),i*1000);
        }

依然能夠正常使用

三: function(i){}(i) 兩個i都不能少 ,少了第一個  i的值會變成全是5,但是依然能夠按5,4,3,2,1的時間順序輸出5

少了第二個 i 的值會變成NAN

四:換一種方法 將整個setTimeout 都封起來

        for(var i=5;i>0;i--){
        
        (function(i){
        
            setTimeout(function(){       
               
                   // $scope.upstate="上傳失敗!"+(5-i)+"秒后本窗口關閉";  
                    window.upstate="上傳失敗!"+(5-i)+"秒后本窗口關閉";                    
                    //$scope.upclosed();    
                    console.log(window.upstate);
                    //$scope.$apply();
                    console.log(new Date().getTime());                    
                    if(i==5){                        
                       // $scope.upclosed();            
                    }                    
                },i*1000);
        })(i)
    
    }

也是 可以的 這個時候(function(){}())的最外層()不能去掉的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM