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.log
和 callback
现在都引用 相同的 函数。所以 callback("test-output")
与 console.log("test-output")
.
相同
所以这里我们比长版少了一级。顺序是我们调用test
,然后test
调用console.log
。包装器不存在。
注意:这里有一些关于 this
绑定的事情要说,这与上面的例子没有任何关系,但如果那个话题 concerns/interests 你,然后阅读更多关于它的信息: How does the this
keyword work in JavaScript.
我正在 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.log
和 callback
现在都引用 相同的 函数。所以 callback("test-output")
与 console.log("test-output")
.
所以这里我们比长版少了一级。顺序是我们调用test
,然后test
调用console.log
。包装器不存在。
注意:这里有一些关于 this
绑定的事情要说,这与上面的例子没有任何关系,但如果那个话题 concerns/interests 你,然后阅读更多关于它的信息: How does the this
keyword work in JavaScript.