2016-04-26 40 views
1

有些字符串被new Function(...)調用轉換成函數。替換arguments.callee裏面的新函數

如何在不使用arguments.callee的情況下在字符串內部獲得對象的這個函數?

var f = new Function('return arguments.callee.smth'); 
f.smth = 128; 
f(); // 128 
+2

你不能。你爲什麼需要這樣做(你在用什麼'Function'構造函數)?請提供您的實際代碼,以便我們能夠提出適合您問題的解決方案。 – Bergi

+0

也許看看[這種方法](http://stackoverflow.com/a/24032179/1048572)將值傳遞到構造函數的作用域。 – Bergi

+1

@Bergi,實際上我想[擴展函數](// stackoverflow.com/q/36871299/4928642),但關於通過生成的函數自己引用自我引用的想法對我來說似乎很有趣。 – Qwertiy

回答

0

做這種事情的唯一方法是使用閉包。

例如:

var f = (function() { 
    var f = new Function('return this().smth').bind(function() { return f }); 
    return f; 
})(); 

f.smth = 128; 
f(); 

或者說:

var f = (function (g) { 
    return function f() { 
    return g.apply(f, arguments) 
    }; 
})(new Function('return this.smth')); 

f.smth = 128; 
f(); 

無論如何,好像裏面構造函數無論嚴格模式arguments.callee作品。

這個主題的鏈接:

+2

這不會返回'new Function()',而是一個「綁定函數」(例如沒有'.prototype')。你可能已經變得更簡單了:-) – Bergi

+0

@Bergi,_「你可能已經變得更輕鬆了:-)」 - - 怎麼? – Qwertiy

+2

通過去掉'new Function'並返回一個閉包(從函數表達式創建),我的意思是。 – Bergi