在玩游戏并尝试覆盖Function
原型时,我遇到了一个有趣的行为。
假设我们已经覆盖了toString(),如下所示:
const funcToString = Function.prototype.toString;
Function.prototype.toString = function() {
console.log("lol");
return funcToString.call(this);
}
现在,让我们采取行动,看看会发生什么:
(function foo(){}).toString(); // TypeError
TypeError:Function.prototype.toString要求' this'是一个功能
通过一些阅读,我了解到这与内部函数将其包装在代理中的方式有关 - 并且它与它的目标无法区分,会导致TypeError。
但现在,我们可以尝试这样做:
function boo(){};
boo.toString(); // prints "lol", as we wanted
要添加所有这些,我只在浏览器运行时中观察到此行为。在Node.js中,两种情况下一切都很顺利。
编辑:确认在REPL中工作没有任何错误。
就个人而言,我无法理解其中的区别是什么/究竟发生了什么。 如果有人能对此有所了解,将不胜感激。
答案 0 :(得分:8)
这是缺少分号的问题:
Function.prototype.toString = function() {
…
}; /*
^ */
(function foo(){}).toString();
否则将其解释为
Function.prototype.toString = function(){…}(function foo(){}).toString();
调用应该像IIFE一样覆盖toString
的函数表达式
… (function(){…}(function foo(){})) …
......在全球范围内,而不是在一个函数上。