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

举报
红目香薰 发表于 2024/06/30 20:05:27 2024/06/30
【摘要】 ​解决Cannot readproperty'XXXXXXX'of undefined异常function(){} 与 ()=>{}的区别主要是它们的作用域的不同。个人建议使用()=>{},因为使用function(){}使用外部变量的时候会出现下面的异常:Cannot readproperty'XXXXXXX'of undefined​编辑例如使用function(){}这种,这里的thi...

解决Cannot readproperty'XXXXXXX'of undefined异常

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

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

Cannot readproperty'XXXXXXX'of undefined

​编辑

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

​编辑

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

setInterval(()=> {   },500)

完美解决问题。

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

setInterval()是以指定的时间为周期调用函数的方法。

setTimeout()是延时指定的时间来执行某个函数的方法。

两个函数虽然作用不同,但传参方式和作用域是相同的。

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

<script>
    function fn(value){
        alert("value=" + value);
    }
    setTimeout("fn(1)", 1000);
</script>

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

<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()的第二种传参方式。

<script>
    function outerFn(){
        var value = 1;
        function fn(){
            alert("value=" + value);
            value += 1;
        }
        setInterval(fn, 3000);
    }
    outerFn();
</script>

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

<script>
    function outerFn(){
        var value = 1;
        function fn(n){
            alert("value=" + n);
        }
        setTimeout(fn(5), 1000);
    }
    outerFn();
</script>

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

setTimeout(fn, 1000);//引用

setTimeout(fn(5), 1000);  //直接执行

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

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

<script>
    function outerFn(value){
        function fn(){
            alert("value=" + value);
        }
        setTimeout(fn, 1000);
    }
    outerFn(5);
</script>

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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。