首页 > 解决方案 > 关于函数对象的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(),我希望callfrom 方法Function1会被调用,但事实并非如此。我想我在这里想错了方向。我只是假设foo.call()并且foo()在似乎并非如此的函数对象上执行时是等价的。有人可以给我一个关于呼叫解决方案实际工作方式的提示吗?

标签: javascript

解决方案


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

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

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

foo()


推荐阅读