是否可以将原始函数“隐藏”为.bind()
的结果?
我想得到它的toString()
。
function foo() {
return 'bar';
}
let baz = foo.bind();
console.log(baz.toString()); //-> function foo() { return 'bar'; } and not -> function () { [native code] }
答案 0 :(得分:2)
没有从baz到foo的内置链接,但你可以添加一个:
function foo() {
return 'bar';
}
let baz = foo.bind(this);
baz.original = foo;
console.log(baz.original.toString());
如果您希望在有人绑定某个功能时自动执行此操作,您可以覆盖Function.prototype.bind
。不是我推荐的东西,但它看起来像这样:
// Using an IIFE to isolate realBind from eveyone else's scope
(function () {
const realBind = Function.prototype.bind;
Function.prototype.bind = function () {
const result = realBind.apply(this, arguments);
result.original = this;
return result;
}
}());
function foo() {
return 'bar';
}
let baz = foo.bind(this);
console.log(baz.original.toString());
答案 1 :(得分:1)
所以,经过一些挖掘......
在没有覆盖内置方法的情况下,似乎firefox中没有任何方法可以完成这项工作。
但是在chrome中,以下 工作:
function foo() { console.log('yo'); };
console.log(foo.bind({}).toString()); // function () { [native code] }
console.log(foo.bind({})); // f foo () { console.log('yo') }
因此,虽然无法通过调用.toString
将原始文件恢复原状,但将函数对象直接记录到chrome中的控制台将生成原始函数体的表示。
Here是指向Function.prototype.toString
由ste2425提供的规范相关部分的链接。