在Javascript中获取原始函数

时间:2017-11-29 15:40:24

标签: javascript function

是否可以将原始函数“隐藏”为.bind()的结果? 我想得到它的toString()

function foo() {
    return 'bar';
}

let baz = foo.bind();

console.log(baz.toString()); //-> function foo() { return 'bar'; } and not -> function () { [native code] }

2 个答案:

答案 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提供的规范相关部分的链接。