2015-07-25 4 views
1

Я хотел бы изменить имя новой функции, возможно ли это?Есть ли способ изменить имя функции

function returnFunctionWithName(str){ 
    return function(){ 
    return srt 
    } 
} 

var x = returnFunctionWithName("hello") 

console.log(x) // => [Function] 

То, что я хочу что-то вроде этого: (это не работает)

function returnFunctionWithName(str){ 
    return function [str](){ 
    return srt 
    } 
} 

var x = returnFunctionWithName("hello") 

console.log(x) // => [Function: hello] 

Просто попытался это тоже без эффекта:

function returnFunctionWithName(str){ 
    var x = function(){ 
    return str 
    } 
    x.name = str 
    return x 
} 

var x = returnFunctionWithName("hello") 

console.log(x) // => [Function: hello] 
+1

Прежде всего, объясните, чего вы хотите достичь. – Tomalak

+0

Вопрос сейчас немного загадочный. Можете ли вы описать, какую проблему вы действительно пытаетесь решить, вместо того, чтобы комментировать предлагаемое решение, мы действительно можем предложить решение реальной проблемы. – jfriend00

+0

http://jsfiddle.net/arunpjohny/vfc99eg4/ –

ответ

0

Вы можете технически установить функцию-х name:

Object.defineProperty(theFunction, 'name', { 
    get: function() { 
     return 'NewFunctionName'; 
    } 
}); 

Однако я не знаю, решает ли эта проблема, как в моем quick tests это фактически не отображало ожидаемое имя, когда функция console.log.

Причина, по которой x.name = str не работает, это Function#nameisn't writable. Это is, однако, «Конфигурируемый», что означает, что вы можете общаться с ним через Object.defineProperty().

+0

Прохладная идея! Это дает мне 'TypeError: не могу переопределить свойство: name' в nodejs. – ThomasReggi

+0

Хотя это верно, оно не применяется ко многим средам ... Некоторые защищают свойство name, не изменяя никаких изменений. –

+0

Хм, просто подтвердил эту ошибку в node.js, как хорошо .... так, что @FuzzicalLogic сказал. : \ – jmar777

-1

Единственный кросс-браузерный способ, который я нашел, чтобы делать то, что вы просите, на самом деле очень опасен во многих обстоятельствах ... Итак, с осторожностью, ответ ниже.

function makeNewFunction(name) { 
    return eval('(function(){ return function ' + name + '() {' + 
     ' // code as a string' + 
     + '}; })();'); 
} 

Мне пришлось использовать что-то вроде этого некоторое время назад, используя технику, которую я называю злой классовой.

Смежные вопросы