zxCoder
V2EX  ›  问与答

刚学 js,不太熟悉回调函数,想问下这个代码会出问题吗

  •  
  •   zxCoder · Aug 3, 2021 · 2258 views
    This topic created in 1927 days ago, the information mentioned may be changed or developed.
    function init(fn){
        document.onkeydown=(e)=>{
            if(e.key==="Enter"){
                fn(true);
            }else if(e.key==="Escape"){
                fn(false);
            }
        }
    }
    
    let fn=(arg)=>{
        if(arg){
            console.log("enter");
        }else{
            console.log("esc");
            init(fn);
        }
    }
    
    init(fn)
    

    想监听 enter 和 esc 键,实现一个类似前进和后退的动作,不知道这个代码会出问题吗,一开始以为是无限递归,但是跑起来又好像没问题

    12 replies  •  2021-08-04 14:09:05 +08:00
    3dwelcome
    3dwelcome
    Aug 3, 2021 via Android
    1
    不知道为什么要函数套娃,好像没什么实际意义,单纯为了测试?
    zxCoder
    zxCoder
    OP
    Aug 3, 2021
    2
    @3dwelcome 因为写着写着就需要这样子。。。。把业务相关的拿掉就是这个结构了。。。我也觉得怪怪的
    xiangyuecn
    xiangyuecn
    Aug 3, 2021
    3
    很正常不过的代码了,原汁原味的 js

    函数赋值了一下而已,并没有调用
    shakaraka
    shakaraka
    Aug 3, 2021
    4
    ```
    function init() {
    document.onkeydown = (e) => {
    switch (e.key) {
    case 'Enter':
    isEnter()
    break;
    case 'Escape':
    isEscape()
    break;
    }
    }
    }

    function isEnter() {
    //
    }

    function isEscape() {
    //
    }

    init()
    ```

    这样每个按键的 func 各做各的不就行咯。
    wenzichel
    wenzichel
    Aug 4, 2021
    5
    点击 esc 是会再次执行 init 方法,但只是 onkeydown 方法再次被重新定义而已。

    init 中传入 fn 方法也是可以的,这 fn 就是一个回调函数,然后执行 fn 这个函数。
    emonc
    emonc
    Aug 4, 2021 via Android
    6
    可读性好差😪
    Puteulanus
    Puteulanus
    Aug 4, 2021
    7
    document.addEventListener('keydown', console.log)
    考虑下 Listener 不
    learningman
    learningman
    Aug 4, 2021 via Android
    8
    可以是可以,好丑
    raaaaaar
    raaaaaar
    Aug 4, 2021 via Android
    9
    wenzichel
    wenzichel
    Aug 4, 2021
    10
    @Puteulanus 你这种写法,多次执行时,会造成重复监听!
    Puteulanus
    Puteulanus
    Aug 4, 2021
    11
    @wenzichel 先不说为什么要多次执行。。

    > getEventListeners(document)
    < {click: Array(1), DOMContentLoaded: Array(1), mouseup: Array(1)}

    > document.addEventListener('keydown', console.log)
    < undefined

    > document.addEventListener('keydown', console.log)
    < undefined

    > getEventListeners(document)
    < {keydown: Array(1), click: Array(1), DOMContentLoaded: Array(1), mouseup: Array(1)}

    不用匿名函数,你确定会重复监听吗
    看看 https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#multiple_identical_event_listeners
    wenzichel
    wenzichel
    Aug 4, 2021
    12
    @Puteulanus 哦,么事了,我是用匿名函数来注册的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2091 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 11:43 · PVG 19:43 · LAX 03:43 · JFK 06:43
    ♥ Do have faith in what you're doing.