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(未定义)可以,不应该抛出错误。