Javascript 关于‘;这’;内部高阶函数';s回调
关于JavaScript高阶函数回调中的“this”,我有一个问题 我一直在探索以下代码-目标是将接受回调的函数转换为返回承诺的函数。 资料来源: 接受回调的函数: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.
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()表示对象;
没有这个()的对象代码>