关于函数对象上的javascript调用结果的问题

时间:2019-05-23 09:45:24

标签: javascript

对于在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()在函数对象上执行时是等效的,似乎并非如此。有人可以给我提示一下呼叫解析实际上是如何工作的。

1 个答案:

答案 0 :(得分:2)

调用函数时,引擎将调用[[Call]](而不是call),这是一种内部方法,在您的代码中不可用。如果要拦截[[Call]],唯一的方法是使用Proxy钩子创建apply

function foo() {
    console.log('foo')
}

foo = new Proxy(foo, {
    apply(target) {
        console.log('foo called!')
        target()
    }
});

foo()