2016-04-26 3 views
1

Некоторая строка преобразуется в функцию по вызову new Function(...).Заменить аргументы.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