JS:什么时候需要 Function.prototype.apply() 或 call() 来引用这个

JS: When is Function.prototype.apply() or call() necessary to refer to this

我正在学习 JS。我正在使用 Mongoose,我想将函数和参数传递给回调,但我必须改用 call()。

// Car is a model. Using Express in Node.js
express.Router().route('/')
    .get((req,res,next)=>{
        print(res,next,Cars.find)
    })

const print = async(res,next,func,param1={})=>{
    try {
        const cars = await func.call(Cars,param1)
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(cars);
    } catch (err)
        next(err);
}

当我只是在 print(...) 中执行 func(param1) 时,它对我不起作用,returns 这个错误。

MongooseError: `Model.find()` cannot run without a model as `this`.
Make sure you are calling `MyModel.find()` where `MyModel` is a Mongoose model.

你能解释一下为什么会这样吗?我什么时候需要使用 apply()/call() 来传递这个?在 Mongoose 的这种背景下和一般情况下?

此外,我对 next() 和 next(err) 有点困惑。文档说这只是程序可以在某种意义上“跳过”错误,我可以明显地看到这一点。但它是像我们可以修改的回调函数还是内置的东西?

编辑:我在看 How to access the correct `this` inside a callback 是不是因为不知何故对象没有传递到 print()

在js中,this is determined at run time和指的是运行什么的方法。如果该方法由箭头函数定义或在箭头函数中调用,则 this 向上冒泡到父函数。在这种情况下,如果我不使用 call()this 就会是 get()。所以我在某种意义上是正确的,父对象 Cars 没有与 Cars.find().

一起传递