我试图深入理解当我调用javascript函数时会发生什么。
我的第一个目标是在调用voila
函数时记录any
之类的内容。当我说任何意味着任何。让它从原型创建实例。或者让它成为一个简单的函数调用。好吧,我也不在乎我将在屏幕上看到的混乱。
像这样的东西
const oldCall = Function.prototype.call;
Function.prototype.call = function(cont, ...args) {
console.log('voila');
oldCall(cont, ...args);
}
以上我们都知道上面会陷入无限递归,因为oldCall
再次是一个函数调用。
但这只是为了表达我的意图。
那么应该是什么样的完美方式呢?
在最糟糕的情况下,我甚至可以通过修补v8为nodejs创建一个新的自定义构建。
答案 0 :(得分:0)
以上我们都知道上面会陷入无限递归,因为oldCall又是一个函数调用
它不会陷入困境。调用函数并调用函数的.call
属性是完全不同的事情。虽然您可以重写.call
属性,但您肯定无法拦截函数调用。
要正确理解.call
正在做什么,请看一下这个小的polyfill:
Function.prototype.call = function(context, ...args) { // the .call property
const fn = Symbol();
context[fn] = this;
context[fn](...args); // the real call
};
那么应该是什么样的完美方式呢?
没有办法。
是的,听起来不错,玩得开心:)在最糟糕的情况下,我甚至可以通过修补v8为nodejs创建一个新的自定义构建。