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