对于在javascript中实际调用函数的方式,我有些困惑。假设我们有以下示例代码。
var foo = function() {
console.log("hello world");
}
foo();
首先,我们创建一个由foo引用的函数对象,然后调用它。我遍历了说明内部foo()
实际上在函数对象上调用call()
的文档。这也很有意义,因为我可以将foo()
替换为foo.call()
,而上面的示例没有任何变化。
但是,假设我想通过以下方式创建函数对象:
class Function1 extends Function {
call() {
console.log("hello wold");
}
}
const foo = new Function1();
foo.call();
使用foo.call()
时,将调用正确的方法。但是,当我尝试调用foo()
时,我希望可以调用call
中的Function1
方法,但并非如此。我想我在这里想错了方向。我只是假设foo.call()
和foo()
在函数对象上执行时是等效的,似乎并非如此。有人可以给我提示一下呼叫解析实际上是如何工作的。
答案 0 :(得分:2)
调用函数时,引擎将调用[[Call]]
(而不是call
),这是一种内部方法,在您的代码中不可用。如果要拦截[[Call]]
,唯一的方法是使用Proxy
钩子创建apply
:
function foo() {
console.log('foo')
}
foo = new Proxy(foo, {
apply(target) {
console.log('foo called!')
target()
}
});
foo()