专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

setinterval怎么用,setinterval的用法及注意事项

来源:小易整编  作者:小易  发布时间:2023-01-04 10:30
摘要:setInterval的使用及注意事项语法:返回值需要注意的点详细介绍1、被忽略的参数2、setInterval为什么容易造成内存泄露3、回收setInterval4、this的指向问题语法://写法1varintervalID1=sc...

setInterval的使用及注意事项

  • 语法:

  • 返回值

  • 需要注意的点

  • 详细介绍

    • 1、被忽略的参数

    • 2、setInterval为什么容易"造成"内存泄露

    • 3、回收setInterval

    • 4、this的指向问题

语法:

// 写法1 var intervalID1 = scope.setInterval(func, delay, [arg1, arg2, ...]); // 写法2 var intervalID2 = scope.setInterval(code, delay);

上述代码的参数介绍:

  • func:每延迟指定毫秒后执行一次的函数。不向函数传递任何参数,也不需要返回值。
  • code:这个语法是可选的,可以传递一个字符串代替一个函数对象,传递的字符串会被编译,然后每个 delay 毫秒事件内执行一次,不是很推荐这种写法,有点类似eval的那个参数。
  • delay:每次延迟的毫秒数,函数的每次调用会在延迟之后发生,和 setTimeout 一样,实际的延迟时间可能会长一点。这个时间计算单位是毫秒,如果这个参数值小于 10,则默认使用值为 10。
  • arg1/2/3...:第三个及以后的参数会被当作第一个参数的函数形参

let timer3 = setTimeout((a, b) => {  console.log(a, b);  console.log('测试回调函数的形参传值。') }, 1000, '小石头', '💖') // 一秒后执行回调函数,打印结果:小石头 💖

setinterval怎么用,setinterval的用法及注意事项

返回值

返回值 intervalID 为非零数值,用来标识通过 setInterval 创建的计时器,这个值可以用作 clearInterval 的参数来清除对应值。

var intervalID1 = scope.setInterval(()=>{}, 1000); clearInterval(intervalID1);

需要注意的点

  • setInterval 和 setTimeout 共享一个 ID 池
  • setinterval怎么用,setinterval的用法及注意事项

  • setInterval 需要及时清除,防止内存泄漏
  • 参数 code 传入的值为函数:setInterval('fn()',1000)
  • setInterval 可能不是精确的(这一点,后续用专门的篇幅讲解)

详细介绍

1、被忽略的参数

setInterval 和 setTimeout 一样,参数为任意参数,第一个是回调。第二个是时间戳,从第三个参数开始,参数会被作为第一个参数 (也就是回调函数) 的形参使用,类似于闭包传值,当然,从第三个参数开始以及后面的参数,我们可以理解为 rest 表达式(及…args) ,用下面的这段代码举个例子

function sum(x, y, z) {  console.log(x + y + z); } setTimeout(sum, 1000, 1, 2, 3); // 一秒后打印:6

2、setInterval为什么容易"造成"内存泄露

什么是内存泄漏: 通俗一些,就是我们创建的变量或者定义的对象,用完或者不再使用之后,没有被 GC (垃圾回收),导致系统内没有新的内存可以分配给后面的变量,导致内存泄漏。

比如一般我们实现一个简单的计时器,我们会想到 setInterval,如果我们不停的改变 do,而且内部引用变量庞大,用完后不清理这些引用,就很容易造成内存泄漏。
当然,甚至还有更气人的开发者,还是以计时器为例,点击 dom 开始计时,而没有做任何的限制,用户多点几下, setInterval 被多次创建等等问题。

总结: setInterval 并不会造成内存泄漏,是使用者的滥用,导致现在只要看到 setInterval 等就会觉得心烦不已。

3、回收setInterval

const timer = setInterval(() => {  console.log("sunny"); }, 500); clearInterval(timer);

在使用 clearInterval 或 clearTimeout 清除了setInterval之后,timer会被GC掉吗?

答案是:不会,因为clearInterval 或 clearTimeout只能清除对应id的setInterval(或setTimeout),清除之后timer依旧为id,所以不会被GC。我们可以手动将其赋值为null,等待回收。

let timeTest = setInterval(() => {    console.log(timeTest, 'setInterval') }, 1000) console.log(timeTest, 'out') let timeOut = setTimeout(() => {    console.log(timeTest, 'start')    clearInterval(timeTest) // 3秒后,使用clear后,timeTest的值依旧是ID数字值,所以需要手动置为null    // timeTest = null    console.log(timeTest, 'end')    setTimeout(() => {        console.log(timeTest, 'inner')    }, 1000) }, 3000) console.log(timeOut, 'timeout')

setinterval怎么用,setinterval的用法及注意事项

4、this的指向问题

var i = 0; const o = {    i: 1;    fn: function(){        console.log(this.i);    } } setTimeout(o.fn, 1000); // 打印结果:0

答案为什么是0?fn不是对象o调用的吗?this不应该指向对象o吗?为啥只想window了?

这是因为setTimeout是在全局环境(window EC)下调用的,当计时器到达时,函数体被推入执行栈,其实相当于:

var newFn = o.fn; newFn();


本文地址:百科问答频道 https://www.neebe.cn/wenda/886582.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • setinterval怎么用,setinterval的用法及注意事项

    setinterval怎么用,setinterval的用法及注意事项

    setInterval的使用及注意事项语法:返回值需要注意的点详细介绍1、被忽略的参数2、setInterval为什么容易"造成"内存泄露3、回收setInterval4、this的指向问题语法://写法1varintervalID1=sc...

  • 周排行
  • 月排行
  • 年排行

精彩推荐