代码之家  ›  专栏  ›  技术社区  ›  Guichi

如果参数是绑定函数,则无法正确调用回调

  •  0
  • Guichi  · 技术社区  · 8 年前

    function invokeCb(cb){
        cb();
    }
    function test(x){
        console.log(x)
    }
    const para="xyz";
    
    invokeCb(test.bind(null,para)) //(1)
    invokeCb(()=>{test(para)}) //(2)
    

    (1) . 然而,在现实世界中,我遇到了一些意想不到的行为

    redux

    store.subscribe(
        ()=>{(saveState.bind(null,store.getState()))()}
    )
    

    store.subscribe(saveState.bind(null,store.getState()))
    

    store.getState() 似乎从未正确调用

    如果你需要更多的语境。在这里: https://egghead.io/lessons/javascript-redux-persisting-the-state-to-the-local-storage

    也许我错过了两种形式之间的一些细微差别,有人能指出吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Bergi    8 年前

    区别在于

    • 发生的时间 store.getState() 已评估
    • return ,您将其抑制)

    let data = "abc";
    function invokeCb(cb){
        data = "xyz";
        console.log(cb());
    }
    function test(x){
        console.log(x);
        return x.toUpperCase();
    }
    invokeCb(test.bind(null, data)); // abc ABC
    invokeCb(()=>{ test(data); }); // xyz undefined
    
        2
  •  0
  •   Guichi    8 年前

    下面是要演示的代码:

    function invokeCb(cb){
        cb();
    }
    function test(x){
        console.log(x)
    }
    
    let counter=0;
    function getData(){
      return ({counter:counter++})
    }
    
    const bindVersion=test.bind(null,getData())
    const invokeVersion=()=>test(getData())
    
    //first time
    invokeCb(bindVersion) //{counter:0}
    invokeCb(invokeVersion) //{counter:1}
    
    //second time
    invokeCb(test.bind(null,getData())) //{counter:0}
    invokeCb(()=>{test(getData())}) //{counter:2}
    
    //third time 
    invokeCb(test.bind(null,getData())) //{counter:0}
    invokeCb(()=>{test(getData())}) //{counter:3}
    

    说明:

    • bind 固定的 . i、 e.一次 bound 这是无法改变的。
    • 另一方面,当直接调用is函数时 参数为

    结论:

    从未 将动态参数绑定到函数

    在我的情况下 state immutable 在里面 redux , store.getState() return 每次使用一个新的引用