Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setInterval、递归、计时器Id_Javascript_Timing - Fatal编程技术网

Javascript setInterval、递归、计时器Id

Javascript setInterval、递归、计时器Id,javascript,timing,Javascript,Timing,我从正在观看的教程中获得了以下动画示例: (function() { var speed = 10, moveBox = function(moveBy) { var el = document.getElementById("box"), left = el.offsetLeft; if ((moveBy > 0 && left > 399) || (moveBy < 0 && left < 51

我从正在观看的教程中获得了以下动画示例:

(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);
}());
(函数(){
var速度=10,
moveBox=函数(moveBy){
var el=document.getElementById(“框”),
左=标高偏移左;
if((moveBy>0&&left>399)| |(moveBy<0&&left<51)){
清除超时(计时器);
计时器=设置间隔(函数(){
moveBox(moveBy*-1);
},速度);
}
el.style.left=left+moveBy+px;
};
变量计时器=设置间隔(函数(){
移动盒(3);
},速度);
}());

我只是好奇为什么clearTimeout(timer)不会抛出错误,因为在clearTimeout函数之后定义了timer。

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


有一些关于提升的信息。

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


在任何执行开始之前,JavaScript都会查看所有代码

JS首先创建一个executionContext

然后JS记录对所有函数和变量的引用,它们存储在executionContext的variableObject中

这意味着在javascript开始执行代码之前,它甚至在开始解析执行顺序之前就“知道”了所有函数和所有变量


有关JS如何创建闭包以及JS如何编译代码的更多信息,请参见此链接:

JavaScript在任何执行开始之前查看所有代码

JS首先创建一个executionContext

然后JS记录对所有函数和变量的引用,它们存储在executionContext的variableObject中

这意味着在javascript开始执行代码之前,它甚至在开始解析执行顺序之前就“知道”了所有函数和所有变量


有关JS如何创建闭包的更多信息,请参见此链接,同时也说明了JS如何编译代码:

clearTimeout(未定义)
可以,不应该抛出错误。因为提升<代码>clearTimeout(未定义)可以,不应该抛出错误。