1. setTimeout()函数:
(1)用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器
(2)接受两个参数,第一个参数func|code
是将要推迟执行的函数名或者一段代码,第二个参数delay
是推迟执行的毫秒数。
var timerId = setTimeout(func|code, delay);
console.log(1); setTimeout(‘console.log(2)‘,1000); console.log(3); //1 3 2
上面代码会先输出1和3,然后等待1000毫秒再输出2。注意,console.log(2)
必须以字符串的形式,作为setTimeout
的参数
(3)如果推迟执行的是函数,就直接将函数名,作为setTimeout
的参数
1 function f() { 2 console.log(2); 3 } 4 setTimeout(f, 1000);
上面代码会等待1000毫秒再输出2
(4)setTimeout
的第二个参数如果省略,则默认为0
1 setTimeout(f) 2 // 等同于 3 setTimeout(f, 0)
(5)除了前两个参数,setTimeout
还允许更多的参数。它们将依次传入推迟执行的函数(回调函数)
1 setTimeout(function (a,b) { 2 console.log(a + b); 3 }, 1000, 1, 1);
上面代码中,setTimeout
共有4个参数。最后那两个参数,将在1000毫秒之后回调函数执行时,作为回调函数的参数
(6)还有一个需要注意的地方,如果回调函数是对象的方法,那么setTimeout
使得方法内部的this
关键字指向全局环境,而不是定义时所在的那个对象
var x = 1; var obj = { x: 2, y: function () { console.log(this.x); } }; setTimeout(obj.y, 1000) // 1
上面代码输出的是1,而不是2。因为当obj.y
在1000毫秒后运行时,this
所指向的已经不是obj
了,而是全局环境
(7) 为了防止出现这个问题,一种解决方法是将obj.y
放入一个函数
1 var x = 1; 2 3 var obj = { 4 x: 2, 5 y: function () { 6 console.log(this.x); 7 } 8 }; 9 10 setTimeout(function () { 11 obj.y(); 12 }, 1000); //2
上面代码中,obj.y
放在一个匿名函数之中,这使得obj.y
在obj
的作用域执行,而不是在全局作用域内执行,所以能够显示正确的值
另一种解决方法是,使用bind
方法,将obj.y
这个方法绑定在obj
上面
1 var x = 1; 2 3 var obj = { 4 x: 2, 5 y: function () { 6 console.log(this.x); 7 } 8 }; 9 10 setTimeout(obj.y.bind(obj), 1000) // 2
原文:https://www.cnblogs.com/icyyyy/p/14744486.html