Promise.then(()=>function()) 与 Promise.then(函数)

Promise.then(()=>function()) vs. Promise.then(function)

我正在 Javascript 学习 Promise,但我不明白为什么它们是一样的:

let fifteen = Promise.resolve(15);
fifteen.then(value => console.log(value));

对比

let fifteen = Promise.resolve(15);
fifteen.then(console.log);

如有指点,将不胜感激。

  • .then(console.log)
  • .then((value)=>console.log(value))
    的区别只是第一种情况,console.log隐式接收结果,但在第二种情况下显式接收结果。所以结果是一样的。

  • 此模式与承诺无关。它与传递回调有关。原理是一样的,比如array.forEach,或者setTimeout或者你自己的可以接收回调的函数。

    因此,例如,如果您自己定义这样一个函数,它可能是(就像您在评论中提到的):

    function test(callback) { 
       callback("test-output"); 
    } 
    

    如果你想打印“测试输出”,你可以调用test就像这个简短的版本:

    test(console.log); 
    

    您也可以在这个较长的版本中这样称呼它:

    test((value) => console.log(value));
    

    长版

    在后一种情况下,您实际上即时创建了一个匿名(箭头)函数:

    (value) => console.log(value)
    

    这是 console.log 的封装。如果你用一些参数调用它,你最终会用相同的参数调用 console.log 。您以某种方式为 console.log 创建了一个同义词,因为对于外部世界它的行为方式相同。您可以做一些更详细的事情,并以非匿名方式定义该函数:

    function wrapper(value) { 
        console.log(value)
    }
    

    然后在我们拥有匿名函数的地方使用那个——现在 named——函数:

    test(wrapper);
    

    我们没有做太多改变:我们只是将函数移到了另一个地方,将它变成了一个非箭头函数(并不是真正需要的),并给它起了一个名字 (wrapper)。所以名称 wrapper 现在是该函数的同义词。因此,将 that 传递给 test 与传递文字函数定义本身是一回事。

    这很清楚,现在我们只是在对 console.log 的最终调用之上添加了一个微小的额外层:首先我们调用 test,然后 test 将调用 wrapper,最后 wrapper 会调用 console.log.

    短版

    调用 test 的第一种更简短的方法不是拐弯抹角:它只是说:“我要你调用的函数是 console.log”。所以 test 称它为:

    callback("test-output"); 
    

    提供参数“test-output”。请注意 callback 变量现在是对 console.log 的引用,因为那是我们传递给 test 的参数。 console.logcallback 现在都引用 相同的 函数。所以 callback("test-output")console.log("test-output").

    相同

    所以这里我们比长版少了一级。顺序是我们调用test,然后test调用console.log。包装器不存在。

    注意:这里有一些关于 this 绑定的事情要说,这与上面的例子没有任何关系,但如果那个话题 concerns/interests 你,然后阅读更多关于它的信息: How does the this keyword work in JavaScript.