settimeout是全局函数吗(setTimeout什么意思!)

本文目录
- setTimeout什么意思!
- 单元测试全局变量
- 这段javascript代码为什么把他们放在window.onload 函数里边反而运用不了,一直提示moveElement未定义
- setimemount方法
- setTimeOut与window.setTimeout
- for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10);}
- setTimeout()这个方法不执行
- js的setTimeout做简单移动元素位置,为嘛不动
- 关于js的定时器怎么调用非全局函数
- js内部函数
setTimeout什么意思!
timeout
基本翻译
n. 超时;暂时休息;工间休息
网络释义
Timeout:超时 | 暂时休息 | 暂停采用自动还是手动
或者是定时的意思.
单元测试全局变量
但我们在一个单元测试中测试一个函数的时候,假设这个函数使用了一个全局变量的值,同时调用了另一个函数,该函数也对这个全局变量进行了读写,那么如何测试这个被测函数呢? 一般方法是,对另一个被调用的函数建立桩函数,而桩函数如何写就成了一个棘手的问题,因为全局变量的问题会直接影响到被测函数的运行结果。如
果桩函数不对这个全局变量作任何操作,那么我们在建立测试用例的时候就必须把这个全局变量考虑进去,而不仅仅是被测函数的参数。假设有多个全局变量,毫无
疑问测试用例就会相对复杂,因为多了很多全局变量要考虑,其相互依赖关系将会使测试复杂度呈指数级别上升。这就是他的副作用。
这段javascript代码为什么把他们放在window.onload 函数里边反而运用不了,一直提示moveElement未定义
这是因为当把moveElement函数放入window.onload后,作用域就变了,变成局部变量了,而setTimeout是运行于全局的(即使它是从window.onload内启动的),对于window.onload内部的moveElement它就看不见了,就认为是未定义的了。
可以这样改一下:
var moveElement; //把moveElement先声明为全局变量
window.onload=function(){
moveElement=function(elementID,final_x,final_y,interval){
var elem=document.getElementById(elementID);
var xpos=parseInt(elem.style.left);
var ypos=parseInt(elem.style.top);
if(xpos==final_x&&ypos==final_y)return true;
if(xpos《final_x)xpos++;
if(xpos》final_x)xpos--;
if(ypos《final_y)ypos++;
if(ypos》final_y)ypos--;
elem.style.left=xpos+"px";
elem.style.top=ypos+"px";
var repeat="moveElement(’"+elementID+"’,"+final_x+","+final_y+","+interval+")";
setTimeout(repeat,interval);
}
moveElement("message",200,100,10);
}
或者这样也行:
var moveElement=function(elementID,final_x,final_y,interval){
var elem=document.getElementById(elementID);
var xpos=parseInt(elem.style.left);
var ypos=parseInt(elem.style.top);
if(xpos==final_x&&ypos==final_y)return true;
if(xpos《final_x)xpos++;
if(xpos》final_x)xpos--;
if(ypos《final_y)ypos++;
if(ypos》final_y)ypos--;
elem.style.left=xpos+"px";
elem.style.top=ypos+"px";
var repeat="moveElement(’"+elementID+"’,"+final_x+","+final_y+","+interval+")";
setTimeout(repeat,interval);
}; //在window.onload外面声明moveElement函数
window.onload=function(){
moveElement("message",200,100,10);
}
建议用第二种
setimemount方法
第一种写法↓ setTimeout方法是指在指定时间后执行一次指定函数。强调!只执行一次! ObjSetTimeout后面的window可以省略不写。SetTimeout后面的括号传入函数名称,注意只是传入名称不能有括号,函数名称后面就是时间参数,多少毫秒。 1000就代表1000毫秒之后执行。 现在我们来看看效果 点击事先准备好的方法,后台大概一秒之后就会打印出当前时间。 这是第一种形式,我们下面来看一下第二种形式。 用写成字符串参数形式的这种写法来写的话,会造成javascript引擎两次解析,降低性能,所以不建议使用。但是也是可以用的,确实没错。 控制台输出打印的效果也是和第一种一样的。 还有第三种形式 第三种形式 第三种形式就是传入函数的一种写法,和第二种写法类似。直接传入function,把函数体执行方法写进去。就像平时写事件一样,把整个函数作为一个变量传进去。而不写在外部,这也是一种写法。 但是这个方法始终只能执行一次,如果我想让它一直执行该怎么办呢? 我们再给它写一个方法 在方法二中又写了一个setTimeout,你要在它执行结束的时候又调用了自身。 先打印当前时间,然后马上又执行自身,等于又打开一个新的定时器,每隔1000毫秒执行一次也就是一秒,就相当于死循环。通过死循环的方式来实现一直调用方法一直执行。 我们还能通过cleanSetTimeout这个方法来取消settimeout方法设置的定时器,给了上述方法后,点击关闭SetTimeout定时器后台控制器将不再执行。
查看更多
setTimeOut与window.setTimeout
是一样的
window对象是默认的全局对象,可以省略setTimeout是定时执行一段代码或功能,属于window的一个方法,window又是默认的全局系统对象,所以使用时可以省略掉。所以上面两段代码是一样的。
for(var i=0;i<=3;i++){ setTimeout(function() { console.log(i) }, 10);}
for(var i=0;i《=3;i++){ setTimeout(function() { console.log(i) }, 10);}
答案:打印4次4
这道题涉及了异步、作用域、闭包
settimeout是异步执行,10ms后往任务队列里面添加一个任务,只有主线上的全部执行完,才会执行任务队列里的任务,当主线执行完成后,i是4,所以此时再去执行任务队列里的任务时,i全部是4了。对于打印4次是:
每一次for循环的时候,settimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了4次,就放了4次,当主线程执行完成后,才进入任务队列里面执行。
(注意:for循环从开始到结束的过程,需要维持几微秒或几毫秒。)
当我把var 变成let 时
for(let i=0;i《=3;i++){ setTimeout(function() { console.log(i) }, 10);}
打印出的是:0,1,2,3
当解决变量作用域,
因为for循环头部的let不仅将i绑定到for循环快中,事实上它将其重新绑定到循环体的每一次迭代中,确保上一次迭代结束的值重新被赋值。setTimeout里面的function()属于一个新的域,通过 var 定义的变量是无法传入到这个函数执行域中的,通过使用 let 来声明块变量,这时候变量就能作用于这个块,所以 function就能使用 i 这个变量了;这个匿名函数的参数作用域 和 for参数的作用域 不一样,是利用了这一点来完成的。这个匿名函数的作用域有点类似类的属性,是可以被内层方法使用的。
查了一下百度的一个答案:
setTimeout是一次执行函数,这里是10ms后执行,仅仅执行一次;for(var i=0;i《=3;i++),i的每次取值都是执行setTimeout这个函数,并没有执行setTimeout里面的function(即闭包函数),setTimeout里面的function是有setTimeout的定时触动的,也就是10ms后执行,也就是说i从0~3时,一共执行了4次的setTimeout()函数,此时的i的值是4,由于for语句的执行速度远小于1秒,所以,1秒后,由setTimeout()函数定时触动的闭包函数function()开始执行,alert(i);i的值已经是4了,所以相继打印4次i.
***隐藏网址***
setTimeout()这个方法不执行
setTimeout()方法的第一个参数是一个闭包,它指定了要运行的函数。它的第二个参数是一个数值,表示的是以毫秒计算的运行延时。注意传递给setTimeout()的第一个参数也可以是表示执行代码的字符串,如果是字符串,那么setTimeout()方法会调用Function对象将这个字符串构造成函数执行。
setTimeout及setinterval都是异步执行的函数,就是它会在触发事件发生(延迟时间)之后去执行调用事件,这个过程并不会中断顺序执行的过程,而不是象c语言中的delay一样,延迟的是顺序执行的过程。而该过程大概是开启了另外的一个线程。
js的setTimeout做简单移动元素位置,为嘛不动
你需要在#testDiv设置position:relative,单纯的top和left不会让元素移动,还有你的时间可以设置大一点,你这个全部运行完也就500ms,看不出渐进效果。
为setTimeout赋值全局变量是为了需要时可以清除定时,当然你也可以不赋值全局变量。因为你要循环,推荐使用setInterval,代码如下:
《!DOCTYPE html》
《html lang="zh-cn"》
《meta charset="utf-8" /》
《div id="testDiv" style="position:relative;"》我是测试div,点击下面的按钮就可以看到div缓慢移动。《/div》
《button onclick="jsAnimation();" value="改变位置" 》缓慢移动div的位置《/button》
《script》
var movement;
function jsAnimation(){
var ele = document.getElementById("testDiv");
ele.style.top = "0px";
ele.style.left = "0px";
movement = setInterval("moveObj()",50);
}
function moveObj(){
var ele = document.getElementById("testDiv");
var xPos = parseInt(ele.style.left);
if(xPos == 50){
clearTimeout(movement);
return true;
}
xPos++;
ele.style.left = xPos+"px";
}
《/script》
《/html》
关于js的定时器怎么调用非全局函数
setTimeout和setInterval的第一个参数有两种选择,一种是用字符串,这个字符串会用eval解释运行;另一种是直接给出一个function,直接调用这个function运行。你用function版本的就行了,function版本的比较快。
a.prototype.b = function() {
var me = this;
setTimeout(function() {
me.c(); // 你也可以试试直接用this.c();我不确定这里的this就是a对象,好像不是。
}, 1000);
};
js内部函数
错误原因是因为你settimeout中函数加了引号,加了引号后不再从局部变量中找这个参数,而是到全局环境中找,全局函数当然没有你定义的这个sleep_move_inner了,解决办法是
1 去掉双引号,只写函数名sleep_move_inner
2 在全局作用域中定一个变量,在局部作用于中引用这个变量
全局:var k;
局部:k = sleep_move_inner

更多文章:
跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意
2026年10月11日 05:10
易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)
2026年10月11日 03:00
compare with造句(用compared with和compared to造句)
2026年10月10日 23:30
tensorflow与keras对应版本(为什么tensorflow2.8没有keras)
2026年10月10日 22:10
maven仓库jar网站(如何在maven仓库中添加jar包)
2026年10月10日 19:50






