2013-07-07 45 views
0

我已經從一個教程這個動畫的例子,我看:setInterval的,遞歸,計時器ID

(function() { 

var speed = 10, 
moveBox = function(moveBy) { 
    var el = document.getElementById("box"), 
     left = el.offsetLeft; 


    if ((moveBy > 0 && left > 399) || (moveBy < 0 && left < 51)) { 
     clearTimeout(timer); 
     timer = setInterval(function() { 
      moveBox(moveBy * -1); 
     }, speed); 
    } 

    el.style.left = left + moveBy + "px"; 

}; 

var timer = setInterval(function() { 
    moveBox(3); 
}, speed); 
}()); 

我只是好奇,因爲計時器是clearTimeout(定時器)怎麼不說扔錯誤在clearTimeout功能後,被定義..

+2

由於吊裝。 'clearTimeout(undefined)'很好,不應該拋出錯誤。 – elclanrs

回答

3

的JavaScript變量被提升到封閉範圍的頂部,這樣你的代碼,或多或少,相當於這個:

(function() { 
    var speed = undefined; 
    var moveBox = undefined; 
    var timer = undefined; 

    speed = 10; 
    moveBox = function(moveBy) { /* Stuff that uses timer ... */ }; 

    timer = setInterval(function() { ... }, speed); 
}()); 

這不要緊, var timer是因爲它被提升到頂部而timer被聲明爲整個函數。

MDN docs on var對吊裝的一些信息。

2

JavaScript在任何執行開始之前查看所有代碼。

JS首先創建一個executionContext。

然後JS記錄所有的函數和變量的引用,它們被存儲在ExecutionContext中的variableObject。

這意味着JavaScript的開始執行代碼之前,它「知道」的所有功能和所有變量甚至開始解析執行訂單。

請參閱此鏈接更多信息這也解釋了JS如何創造倒閉,但也說明在一般JS如何編譯代碼:http://jibbering.com/faq/notes/closures/