Javascript 为什么bind_function.toString()不返回原始源代码?

Javascript 为什么bind_function.toString()不返回原始源代码?,javascript,Javascript,例如: function f(a){ return a } var g = f.bind(null); g.toString() // chrome: function () { [native code] } // firefox: function bound f() { [native code] } g.toString()没有返回原始源代码,这有什么微妙的原因吗 当然,我可以通过重写Function.prototype.bind轻松地“修复”它,但我的问题

例如:

function f(a){ return a }
var g = f.bind(null);
g.toString() // chrome:  function () { [native code] }
             // firefox: function bound f() { [native code] }
g.toString()
没有返回原始源代码,这有什么微妙的原因吗

当然,我可以通过重写
Function.prototype.bind
轻松地“修复”它,但我的问题是:我是否在做一些愚蠢的事情,比如用它打开一些安全漏洞

var o_bind = Function.prototype.bind;
Function.prototype.bind = function(){
        var f = o_bind.apply(this, arguments);
        f.orig_func = this;
        return f;
}
function fsrc(f){
        return f.orig_func ?
                String(f.orig_func).replace(/^function/, '$& bound') :
                String(f);
}
(我的重点):

如果func是绑定函数外来对象,则
返回func的依赖于实现的字符串源代码表示形式。陈述必须符合以下规则表示是否包含绑定函数信息或有关目标函数的信息取决于实现。

换句话说,环境可以自由地包含或不包含原始函数的源


我是不是在做一些愚蠢的事情,比如用这个打开安全漏洞

var o_bind = Function.prototype.bind;
Function.prototype.bind = function(){
        var f = o_bind.apply(this, arguments);
        f.orig_func = this;
        return f;
}
function fsrc(f){
        return f.orig_func ?
                String(f.orig_func).replace(/^function/, '$& bound') :
                String(f);
}

假设
toString
为“普通”用户定义函数返回函数的源代码,可能不是。

那么,
.bind
将返回一个新函数。@FelixKling,你是对的,但是
f.toString()!=g、 toString()
:)(绑定可能会返回一个本机函数,当调用该函数时,该函数会使用相关的
thisArg
)实际调用原始函数@Dekel实际上,它就是这样做的。
bind
的简化版本是只返回以下
函数(){return f.apply(thisArg,arguments);}
。完整版本没有太大区别,但可以处理部分分配功能。@Dekel:“但是
f.toString()!=g.toString()
”正是如此。我通常不希望两个不同的函数具有相同的源代码。特别是不是本机函数与用户定义的函数。关于闭包也可以这样说——虽然它们共享相同的“代码”,但它们始终是不同的函数:函数f(){return function(){}}f()==f()//false f().toString()==f().toString()//是的,困扰我的是可能存在一些编程模式,这些模式/依赖于/绑定(),没有向新函数泄漏有关原始函数的任何信息。