javascript - 关于函数对象的 javascript 调用解析的问题

标签 javascript

我对 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/

相关文章:

javascript - Bootstrap 选择框样式冲突

javascript - $(document).ready() 和在正文末尾包含脚本有什么区别?

javascript - 如何重新排列这些缓动函数以接受 v0、v1 和 t?

javascript - 如何在用鼠标单击时仅在 html 中找到完全相同且具有相同名称的两个类的类?

javascript - 确保内容准备好在有限时间的环境中提供服务的最佳方法是什么?

javascript - 小部件,从选项错误中调用函数?

javascript - 在加载字段集时,我如何专注于我选择的文本字段

javascript - ember,为什么我需要用它包装追加才能工作?

javascript - 使用 XMLHttpRequest 后 Cookie 不存在

javascript - 进行选择下拉列表而不显示值