0

私が見ているチュートリアルからのこのアニメーションの例があります:

(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 (タイマー) がエラーをスローしない方法に興味があります。

4

2 に答える 2

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関数全体に対して宣言されるため、がどこにあるかは問題ではありません。

MDNvarのドキュメントには、巻き上げに関する情報が含まれています。

于 2013-07-07T02:55:43.850 に答える
2

JavaScript は、実行が開始される前にすべてのコードを調べます。

JS は最初に executionContext を作成します。

次に、JS はすべての関数と変数への参照を記録し、それらは executionContext の variableObject に格納されます。

これは、javascript がコードの実行を開始する前に、実行順序の解析を開始する前に、すべての関数とすべての変数について「認識」していることを意味します。

JS がどのようにクロージャーを作成するかを説明する詳細については、このリンクを参照してください。また、JS がコードをコンパイルする方法についても一般的に説明しています: http://jibbering.com/faq/notes/closures/

于 2013-07-07T02:58:53.990 に答える