最简单的代码理解惰性函数

今天讲一下我个人对惰性函数的理解,至于为什么要分析惰性函数,是因为当初学习闭包的时候被惰性函数绕晕了,为此在这个函数上纠结了很长一段时间,还询问了不少大佬,但是给出的专业解释,还是让我有许多不解,今天就用我自己的理解来分析一下惰性函数,一个是为了加深自己的记忆,二个是为让其他刚接触惰性函数的萌新不至于走歪路。

先说一下惰性函数的定义吧,惰性函数:顾名思义,有点懒惰,懒到事件只处理一次,当然不是值整个函数只处理一次。而是里面的某一行或者多行只执行一次。正常情况下,一个函数内部,所有的该执行的东西,无论是定义变量,还是新建对象,亦或者做判断,还是运算,定义定时器等等,都是依照顺序来执行,无论这个函数执行调用多少次,都依旧是如此;

但是惰性函数不同,惰性函数中总有一个分支(某一行),第二次执行的时候会跳过这需要执行的一行。

这样讲仍然会有些难以理解,不要紧,来看这一行代码;

这个代码实现的是不用全局变量,不污染全局的情况下使这个函数每次调用的时候都只返回第一次调用函数的时间。

//定义一个立即执行函数,方便理解也可以叫他三即函数(立即定义,立即调用,立即删除)

var test = (function (){

//定义一个变量给他赋予一个空值

var t = null;

//返回一个函数

return function(){

//返回的函数里面有判断,判断t是否为空,如果是,那么就不执行咯,如果不是空,那么立即返回函数,并且立即终止函数执行

if(t){

return t;

}

//然后我们把这个t的赋值和返会写在return的后面

t = new Date();

return t;

}

})()

console.log(test())

console.log(test())

然后控制台打印调用这个函数的结果。最后发现两次打印一摸一样,原因就是惰性函数,因为第一次执行立即执行函数的时候,没有跳过var t = null;这一步,并且把一个新的函数返回给了test,第二次执行的时候,test只会执行:立即执行函数中的那个新的函数,也就跳过了var t = null;这一步,那么这个分支就不会再执行,既然不重新定义t,也不赋值为空,那么t就保留了上次的时间,我们直接执行新函数中的if判断,因为有值所以为true,判断通过,执行if下的函数体,返回上一次的时间,所以,这个时间永远都和第一次相同,并不是因为两个函数打印的时间不同,而是第二次打印的值根本就与第一次的一致。

再说一个相似的,尽量用最简单的代码理解这些绕脑的东西

<body>

                   <button type="button">点击</button>

                   <script type="text/javascript">

                            var btn =document.getElementsByTagName("button")[0]

                            function dyc(){

                                     var a = 456

                                     console.log(a)

                                     return function(){

                                               a = 123

                                               console.log(123)

                                     }

                            }

                            btn.οnclick=dyc()

                   </script>

         </body>

这个也很好理解,我们先定一个函数,然后定义一个变量a,给它赋值456;

然后打印它,然后返回一个新的函数,新函数中重新给a赋值123,然后打印

最后给button按钮定义一个点击事件,点击事件的背后是调用dyc(),然后我们运行代码

发现代码只输出一次456,而后不论如何点击button按钮,始终只打印123,也就是说定义a并且赋值456并且打印a这两行只执行了一次,这个分支在我们第二次执行的时候被跳过了,其实不是跳过,只是因为,函数dyc()在页面开始运行的时候立马就被调用了,然后打印456,再把dyc()的值变成function() {a = 123;console.log(123);},所以按钮的绑定事件变成function() {a = 123;console.log(123);}。这也就是为何点击按钮多少次,都只打印123了。

其实惰性函数只是闭包中一种用法,但是闭包的用法多种多样,我们需要循序渐进,慢慢的理解,打好基础,才能理解更深层的逻辑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值