Javascript 关于‘;这’;内部高阶函数';s回调

Javascript 关于‘;这’;内部高阶函数';s回调,javascript,callback,this,higher-order-functions,Javascript,Callback,This,Higher Order Functions,关于JavaScript高阶函数回调中的“this”,我有一个问题 我一直在探索以下代码-目标是将接受回调的函数转换为返回承诺的函数。 资料来源: 接受回调的函数: function loadScript(src, callback) { let script = document.createElement('script'); script.src = src; script.onload = () => callback(null, script); script.

关于JavaScript高阶函数回调中的“this”,我有一个问题

我一直在探索以下代码-目标是将接受回调的函数转换为返回承诺的函数。 资料来源:

接受回调的函数:

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.调用(此,…args)

在这种情况下,“这”是什么? 为什么我们不能这样称呼它:f(…args)

我知道,为了追踪回调的“this”指向什么,您需要检查包含它的高阶函数。。。 但我不明白为什么在这种情况下,我们必须明确声明回调的“this”

谢谢你的帮助

为什么我们这样调用f函数:
f.call(this,…args)

在这种情况下,“这”是什么?为什么我们不能这样称呼它:
f(…args)

让我来回答这个问题,在这种情况下,“这”是什么?第一部分:

我们不知道(一般来说),这就是为什么要使用
.call
,但我会讲到这一点

promisify
应该“无缝”包装现有函数。这意味着调用
f
promisify(f)
应返回相同的结果

的值取决于调用函数的方式
promisify
无法知道如何调用新的包装函数,也不知道包装函数是否使用
this
。因此,它需要假设
将是重要的,并且必须以正确设置
的方式调用包装函数。
调用函数并显式设置
值的唯一方法是通过
调用
应用
。如果函数被称为
f(…args)
,那么
中的
将是全局对象或
未定义的

下面是一个更简单的包装函数,它演示了这个问题:

函数wrapWithThis(f){
返回函数(…args){
f、 调用(此,…args);
}
}
不带此的函数包装(f){
返回函数(…args){
f(…args);
}
}
函数wrapMe(){
console.log(this.foo);
}
常量对象={
傅:42,,
用这个:wrapWithThis(wrapMe),
没有这个:WrapWithis(wrapMe),
};
用this()表示对象;
没有这个()的对象