zoukankan      html  css  js  c++  java
  • 回调函数的理解

    js回调函数


     

    什么是回调函数

    在JavaScript中一个函数可以作为另一个函数的参数,这个作为参数的函数就叫回调函数,以回调函数作为参数的函数叫做主函数

     

    回调函数简单写法

    //含有回调函数的函数
    function main(callback){
    …………//主函数逻辑
    callback(a,b,c……)// 主函数触发某种条件传值到回调函数并执行
    }
    //调用
    main(function callback(a,b,c……){
    ………………//回调函数中逻辑处理
    })


     

    回调函数场景运用

    场景:我今年18岁,准备找个女朋友,有三个人选(姑娘A、B、C),我表白之后姑娘都会过一段时间给我回复;我最喜欢A姑娘,不过我不知A姑娘是不是也喜欢我,表白成功率为0.4,我次之喜欢B姑娘,表白成功率为0.5,我知道姑娘C很喜欢我,表白成率为1,那么问题来了,谁会成为我最终的女票呢?

    场景模拟:用Math.randowm()生成一个[0,1)之间的一个随机数,如果这个随机数小与scale(scale可以表示表白成功的概率),则表示我表白成功了,用setTimeout(),延时1000ms,表示姑娘们需要这么长时间给我回复

    用Java习惯实现:

     

    function getAmie(woman,scale){//woman我表白的姑娘 scale 表白成功的概率 
       let temp = Math.random();
        console.log(temp);
        if(temp<scale){
            console.log(`${woman}答应做我女朋友`);
            temp = woman;
        }else{
            console.log(`${woman}对我说你是个好人`);
            temp = false;
        }
        setTimeout(() => {
            return temp;
        }, 1000);
    }
    //调用方法,计算谁最终成为我的女朋友
    if(!getAmie("姑娘A",0.5)){
        if(!getAmie("姑娘B",1)){
    
        }else{
        console.log("最终姑娘B成为了我的女朋友");
        }
    }else{
        console.log("最终姑娘A成为了我的女朋友");
    }
    

    然而你会发现执行结果是这样的:
    getAmie.gif

    没错这个确实不是我们想要的,因为JavaScript是单线程的,不会等到一个函数执行完才会去执行另一个函数,所以用这种方式写是不行的,用回调方式实现乳腺:

     

    function getAmie(woman,scale,callback){//woman我表白的姑娘 scale 表白成功的概率 callback回调函数,callback参数为姑娘名时表示表白成功,为false表示获得好人证一张
       let temp = Math.random();
        console.log(temp);
        if(temp<scale){
            console.log(`${woman}答应做我女朋友`);
            temp = woman;
        }else{
            console.log(`${woman}对我说你是个好人`);
            temp = false;
        }
        setTimeout(() => {
            callback(temp);
        }, 1000);
    }
    //调用方法,计算谁最终成为我的女朋友
    getAmie("姑娘A",0.4,(temp) => {
        if(temp){
            console.log("最终姑娘A成为了我的女朋友");
            return;
        }else{
            getAmie("姑娘B",0.5,(temp) => {
                if(temp){
                    console.log("最终姑娘B成为了我的女朋友");
                    return;
                }else{
                    getAmie("姑娘C",1,(temp) => {
                        if(temp){
                          console.log("最终姑娘C成为了我的女朋友");
                        }else{
                            return;
                        }
                    })
                }
            })
        }
    })
    

    看效果,刷新了几次
    getAmiecallback.gif.gif

  • 相关阅读:
    ERROR Function not available to this responsibility.Change responsibilities or contact your System Administrator.
    After Upgrade To Release 12.1.3 Users Receive "Function Not Available To This Responsibility" Error While Selecting Sub Menus Under Diagnostics (Doc ID 1200743.1)
    产品设计中先熟练使用铅笔 不要依赖Axure
    12.1.2: How to Modify and Enable The Configurable Home Page Delivered Via 12.1.2 (Doc ID 1061482.1)
    Reverting back to the R12.1.1 and R12.1.3 Homepage Layout
    常见Linux版本
    网口扫盲二:Mac与Phy组成原理的简单分析
    VMware 8安装苹果操作系统Mac OS X 10.7 Lion正式版
    VMware8安装MacOS 10.8
    回顾苹果操作系统Mac OS的发展历史
  • 原文地址:https://www.cnblogs.com/WP-WangPin/p/14175802.html
Copyright © 2011-2022 走看看