最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 《JS 函数的执行时机》

    正文概述 掘金(fjl)   2021-07-10   533

    JS 函数的执行时机

    JS函数在不同的时候运行,会有不同的运行结果 本文将分别举例分析

    案例一

    let a = 1
    function fn(){
        console.log(a)
    }
    

    这里不会打印任何东西,因为函数只是声明了,但是没有执行

    案例二

    let a = 1
    function fn(){
        console.log(a)
    }
    fn() // 1 
    
    

    这里会打印a, 因为一开始声明了 a , a 的值为1,然后调用函数 fn , 打印 a。

    案例三

    let a = 1
    function fn(){
        console.log(a)
    }
    a = 2
    fn() // 2
    

    这里会打印2, 因为在调用fn()之前,a 被赋值为2

    小结:

    从以上的例子可以看出,我们在调用函数时,需要仔细注意其中用到的变量值是不是我们需要的值

    异步的案例

    案例一

    let a = 1
    function fn(){
        setTimeout(()=>{
            console.log(a)
        },0)
    }
    fn() // 2
    a = 2
    

    setTimeout会等到当前代码执行完毕后,再执行,即执行完let a= 1, fn(), a=2之后,再执行console.log(a) 所以打印出来a是2

    案例二

    for(var i = 0; i<6; i++){
        setTimeout(()=>{
            console.log(i)
        },0)
    }
    //会打印出6个6
    

    以上代码会打印出6个6, 原理是:setTimeout会等到当前代码的for循环执行完了,再去执行console.log(i) 而for循环执行完之后,i已经是6了 所以会打印出6个6

    关于setitmeout的通俗理解

    你正在打游戏,还剩下最后一关,这时候你妈妈让你去吃饭,你嘴上说马上(对应setTimeout(function, 0)),但其实会把游戏打完之后再去吃饭。

    案例三

    如果希望在for循环使用settimeout时,能够依次打印出0,1,2,3,4,5,怎么写呢?

    for(let i = 0; i<6; i++){
        setTimeout(()=>{
            console.log(i)
        },0)
    }
    // 0 1 2 3 4 5
    

    用Let就可以了,let 会单独创建一个作用域 相当于有6个 i ,相当于以下代码

    (let i = 0) {
        setTimeout(()=>{
            console.log(i)
        },0)
    }
    
    (let i = 1) {
        setTimeout(()=>{
            console.log(i)
        },0)
    }
    
    (let i = 2) {
        setTimeout(()=>{
            console.log(i)
        },0)
    };
    (let i = 3) {
        setTimeout(()=>{
            console.log(i)
        },0)
    }
    
    (let i = 4) {
        setTimeout(()=>{
            console.log(i)
        },0)
    }
    
    (let i = 5) {
        setTimeout(()=>{
            console.log(i)
        },0)
    };
    

    案例四

    除了使用Let,还可以这样解决:相当于每次把i保存下来

    for (var i = 0; i < 6; i++) {
        setTimeout((function(i){
            return function() {
                console.log(i);
            }
        }(i)),0)
    }
    // 0 1 2 3 4 5
    

    一个套娃案例

    function f1(){
        let a = 1
        function f2(){
            let a = 2
            function f3(){
                console.log(a)
            }
            a = 22
            f3()
        }
        console.log(a)
        a = 100
        f2()
    }
    f1()
    

    会输出1和22 一定要记住,函数声明和函数调用是两回事,在函数调用前,函数声明里使用的变量的值可能已经发生变化

    闭包

    《JS 函数的执行时机》 一个函数和它使用的函数外部的变量就组成了闭包
    闭包可以让你从内部函数访问外部函数作用域

    关于闭包的更多细节: developer.mozilla.org/zh-CN/docs/…

    本文为fjl的原创文章,著作权归本人和饥人谷所有,转载务必注明来源


    起源地下载网 » 《JS 函数的执行时机》

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元