2013-01-06 15 views
13

Jak utworzyć funkcję z nazwą dynamiczną? Coś w rodzaju:JavaScript: nazwy funkcji dynamicznych

function create_function(name){ 
    new Function(name, 'console.log("hello world")'); 
} 
create_function('example'); 
example(); // --> 'hello world' 

Również funkcja powinna być obiektem funkcji, więc mogę zmodyfikować prototyp obiektu.

+0

Czy możesz wyjaśnić, jaki problem próbujesz rozwiązać? – Philipp

+0

@Philipp: Na przykład OP może być zainteresowany zastąpieniem jakiegoś konstruktora innym, ale nadaniem mu tej samej nazwy co oryginalny konstruktor, więc kod widzi tę samą nazwę funkcji. To może być jeden z powodów, z którymi mam do czynienia. Ale jestem pewien, że są inni. –

Odpowiedz

11
window.example = function() { alert('hello world') } 
example(); 

lub

name = 'example'; 
window[name] = function() { ... } 
... 

lub

window[name] = new Function('alert("hello world")') 
+0

[Dodaj skrzypce] (http://jsfiddle.net/mE2n5/) w swojej odpowiedzi. –

+9

Nie wiem, dlaczego zła odpowiedź to zła ranga. autor potrzebuje nazwanej funkcji w czasie wykonywania, a nie nazwy globalnej do odwiedzenia. –

+0

poniższy wpis jest lepszy sposób zrobić lub ten? –

13

Grałem około z tym przez ostatnie 3 godziny i wreszcie to przynajmniej nieco elegancki użyciu nowej funkcji, jak sugerowano na inne wątki:

/** 
* JavaScript Rename Function 
* @author Nate Ferrero 
* @license Public Domain 
* @date Apr 5th, 2014 
*/ 
var renameFunction = function (name, fn) { 
    return (new Function("return function (call) { return function " + name + 
     "() { return call(this, arguments) }; };")())(Function.apply.bind(fn)); 
}; 

/** 
* Test Code 
*/ 
var cls = renameFunction('Book', function (title) { 
    this.title = title; 
}); 

new cls('One Flew to Kill a Mockingbird'); 

Po uruchomieniu powyższego kodu na konsoli powinny pojawić się następujące dane wyjściowe:

Book {title: "One Flew to Kill a Mockingbird"}