我对 JavaScript 中函数的实际调用方式有点困惑。假设我们有以下示例代码。
var foo = function() {
console.log("hello world");
}
foo();
首先,我们创建一个由 foo 引用的函数对象,然后调用它。我浏览了文档,其中指出内部 foo()
实际上在函数对象上调用 call()
。这也是有道理的,因为我可以用 foo.call()
替换 foo()
,并且上面的示例没有任何变化。
但是,假设我想通过以下方式创建一个函数对象:
class Function1 extends Function {
call() {
console.log("hello wold");
}
}
const foo = new Function1();
foo.call();
当使用foo.call()
时,会调用正确的方法。但是,当我尝试调用 foo()
时,我希望调用 Function1
中的 call
方法,但事实并非如此。我想我在这里思考的方向是错误的。我只是假设在函数对象上执行时 foo.call()
和 foo()
是等效的,但事实似乎并非如此。有人可以给我一些关于调用解析实际上如何工作的提示吗?
最佳答案
当您调用函数时,引擎会调用 [[Call]]
(而不是 call
),这是一个内部方法,在您的代码中不可用。如果你想拦截[[Call]]
,唯一的方法是创建一个带有apply
钩子(Hook)的Proxy
:
function foo() {
console.log('foo')
}
foo = new Proxy(foo, {
apply(target) {
console.log('foo called!')
target()
}
});
foo()
关于javascript - 关于函数对象的 javascript 调用解析的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56272450/