前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >setInterval函数的function与()=>区别——解决Cannot readproperty‘XXXXXXX‘of undefined异常

setInterval函数的function与()=>区别——解决Cannot readproperty‘XXXXXXX‘of undefined异常

作者头像
红目香薰
发布2024-03-11 08:22:56
890
发布2024-03-11 08:22:56
举报
文章被收录于专栏:CSDNToQQCode

解决Cannot readproperty'XXXXXXX'of undefined异常

function(){} 与 ()=>{}的区别主要是它们的作用域的不同。

个人建议使用()=>{},因为使用function(){}使用外部变量的时候会出现下面的异常:

Cannot readproperty'XXXXXXX'of undefined

例如使用function(){}这种,这里的this.lastresult就无法读取,会爆出 undefined 的异常。

这是用如果换成()=>{}就可以使用了。

setInterval(()=> {   },500)

完美解决问题。

setInterval()和setTimeout()的两种使用方式及作用域

setInterval()是以指定的时间为周期调用函数的方法。 setTimeout()是延时指定的时间来执行某个函数的方法。 两个函数虽然作用不同,但传参方式和作用域是相同的。

第一个参数是用来传递要调用的方法,可以传递一个代码串: 

代码语言:text
复制
 <script>
     function fn(value){
         alert("value=" + value);
     }
     setTimeout("fn(1)", 1000);
 </script>
 

但是当在一个闭包里调用的时候,就会出现问题,如:

代码语言:text
复制
 <script>
     function outerFn(){
         var value = 1;
         function fn(){
             alert("value=" + value);
             value += 1;
         }
         setInterval("fn()", 3000);
     }
     outerFn();//这里无法调用
 </script>
 

会出现错误:Uncaught ReferenceError: fn is not defined

原因是fn()是以字符串的方式传递的,它的作用域是全局作用域,全局作用域是无法访问到fn()的。

解决的办法是fn以函数引用的方式传递,也就是setInterval()的第二种传参方式。

代码语言:text
复制
 <script>
     function outerFn(){
         var value = 1;
         function fn(){
             alert("value=" + value);
             value += 1;
         }
         setInterval(fn, 3000);
     }
     outerFn();
 </script>
 

但是这样又带来问题,如果想给fn传参数怎么办?可以像如下这样去写吗?

代码语言:text
复制
 <script>
     function outerFn(){
         var value = 1;
         function fn(n){
             alert("value=" + n);
         }
         setTimeout(fn(5), 1000);
     }
     outerFn();
 </script>
 

答案是不可以的,函数只写函数名,是函数引用;后面加括号是函数执行。

代码语言:text
复制
 setTimeout(fn, 1000);//引用
 
 setTimeout(fn(5), 1000);  //直接执行
 

所以第7行,没有按照预期延迟1000毫秒执行fn(5),而是立刻就执行了。这要注意和上面第一种方式——传递代码字符串的不同。

如果确实有从外部传参的需要,该怎么办呢?

代码语言:text
复制
 <script>
     function outerFn(value){
         function fn(){
             alert("value=" + value);
         }
         setTimeout(fn, 1000);
     }
     outerFn(5);
 </script>
 

如上,是利用了闭包的原理,fn作为内部函数,是可以访问包含它的outerFn的作用域中的变量的,因此我们想给fn传参,只要给outerFn传参就可以了。这在传递的参数复杂(比如是一个复杂的json)的情况下,很有用途。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决Cannot readproperty'XXXXXXX'of undefined异常
  • setInterval()和setTimeout()的两种使用方式及作用域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档