2016-11-06 48 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返回「正常」的用戶自定義函數的函數的源代碼,可能不會。

相關問題