【发布时间】:2019-09-11 13:08:40
【问题描述】:
我有一个关于 JavaScript 高阶函数回调中的“this”的问题。
我一直在探索以下代码 - 目标是将接受回调的函数转换为返回承诺的函数。 来源:https://javascript.info/promisify
接受回调的函数:
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(null, script);
script.onerror = () => callback(new Error(`Script load error for ${src}`));
document.head.append(script);
}
现在,作者使用了一个高阶函数,它将接受上述函数作为回调并进行承诺:
function promisify(f) {
return function (...args) {
return new Promise((resolve, reject) => {
function callback(err, result) {
if (err) {
return reject(err);
} else {
resolve(result);
}
}
args.push(callback);
f.call(this, ...args);
});
};
};
// usage:
let loadScriptPromise = promisify(loadScript);
loadScriptPromise('path/script.js').then(...);
我不明白的是:
为什么我们要这样调用 f 函数: f.call(this, ...args); ?
在这种情况下,“this”会是什么? 为什么我们不能这样称呼它:f(...args);?
我知道为了追踪回调的“this”指向什么,你需要检查包含它的高阶函数...... 但我不明白为什么在这种情况下我们必须明确声明回调的“this”?
感谢您的帮助!
【问题讨论】:
标签: javascript callback this higher-order-functions