2016-11-06 49 views
1

例子:为什么bound_function.toString()不返回原始源代码?

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); 
} 
+4

好,'.bind'返回一个新的功能。 –

+0

@FelixKling,你是正确的,但'f.toString()!= g.toString()':)(在'bind'可能返回本地函数调用时不与相关'原函数的实际调用thisArg') – Dekel

+0

@Dekel确实,这是_is_它做什么。 bind的简化版本就是返回下面的'function(){return f.apply(thisArg,arguments); }'。完整版本没有那么大的不同,但会处理部分分配功能。 – vlaz

回答

2

The spec says about Function.protoype.toString(重点煤矿):

如果FUNC是绑定函数异国对象,然后
返回FUNC的实现相关的字符串源代码表示。该表示必须符合以下规则。 实现取决于表示是否包含绑定函数信息或有关目标函数的信息。

换句话说,环境可以自由包含原始函数的来源。


我在做一些愚蠢的事就像打开了这个有些安全漏洞?

鉴于toString返回“正常”的用户自定义函数的函数的源代码,可能不会。

相关问题