setTimeout与箭头函数,闭包?

今天在用setTimeout模拟实现setInterval的时候,遇到了一个问题,如下是代码:

//使用settimeout模拟setinterval 
let timer;
function updateTime(){
 let cnt = 0;
 timer = setTimeout(function(){
  console.log(this,cnt)
  cnt ++;
  console.log(cnt)
  if(cnt <= 20){
  setTimeout(arguments.callee,1000)
  
  
  }
  else{
  clearTimeout(timer)
  }
})
}
updateTime()

这么写的话,是可以正常运行的。按照我自己的理解,这里setTimeout的回调函数,应该是闭包起了作用,所以cnt变量才能逐次增加?

但是如果把setTimeout的回调函数,写为箭头函数,就不行了,每次输出的都是cnt = 0. 想问问为什么呢?

...
setTimeout(()=>{
  console.log(this,cnt)
  cnt ++;
  console.log(cnt)
...

另外一个问题:如果把arguments.callee换成 uypdateTime函数名,打印出来的就不会递增,每次都是0。原因是这样做的话,每次会创建一个新的updateTime函数对象吗?

阅读 1.7k
1 个回答

并不是嗷,主要是 arguments.callee 调用的是正在执行的 setTimeout 函数,并不是你想到的 uypdateTime 函数,你可以在 console.log(this,cnt) 之后添加一个 console.log(arguments,arguments.callee) 来查看。
另外 arguments.callee 当前已经是处在 Deprecated 状态,所以了解一下就好了,不知道什么时候浏览器就不提供支持了。

Warning: Accessing arguments.callee in strict mode will throw a TypeError. If a function must reference itself, either give the function expression a name or use a function declaration.

相关阅读
arguments.callee - JavaScript | MDN

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题