2009-07-17 8 views

Odpowiedz

26

Wygląda dobrze dla mnie. I pewnie stworzyć prostą funkcję pomocnika jak następuje:

function runFunction(name, arguments) 
{ 
    var fn = window[name]; 
    if(typeof fn !== 'function') 
     return; 

    fn.apply(window, arguments); 
} 

//If you have following function 

function foo(msg) 
{ 
    alert(msg); 
} 

//You can call it like 

runFunction('foo', ['test']); //alerts test. 
+0

+1, pokonał mnie i miał lepszą funkcję dzwoniącego. – tj111

+0

Dobra odpowiedź. Wydaje mi się, że posiadanie pomocnika, który wykonuje pewne testy poprawności, to świetny pomysł. –

+2

Jak często można wywołać funkcję zadeklarowaną w zasięgu globalnym i nadać jej inny kontekst niż zerowy? (przy okazji myślę, że twoje użycie zakresu słowa jest mylące, kontekst byłby lepszy) – AnthonyWJones

1

Można użyć eval (STR)

eval('foo();'); 

użyć tego z najwyższą ostrożnością.

+1

-1. Nie ma potrzeby używania eval tutaj. – SolutionYogi

+0

Czy rozumiem błędne pytanie? dlaczego eval jest zły? – Gee

+0

Korzystając z eval, wywołujesz parser JavaScript, a dobroć wie, co jeszcze trzeba zrobić, aby napisać tekst i przekształcić go w zestaw instrukcji, które można wykonać. window ['foo']() działa tak, aby uniknąć eval w tym przypadku – AnthonyWJones

6

ja osobiście nie przeszkadza nawet w funkcję pomocnika

window[someKey]('test') 

będzie dobrze.

Jednak generalnie nie zachowałbym zestawu możliwych funkcji, aby zadzwonić na globalny zasięg. Stąd byłoby używać bardziej ogólny wzór: -

obj[someKey]('test') 

których może być obj this, właściwość tego czy zmienna z zamknięcia.

1

można po prostu używać go tak ... (oczywiście zastąpić ciągi ze zmiennymi gdzie potrzebne)

document["getElementById"]("elementName")["style"]["border"] = "1PX SOLID GREEN"; 

który jest również łatwo/zazwyczaj wpisane tak oczywiście ...

document.getElementById("elementName").style.border = "1PX SOLID GREEN"; 

Oto kolejny przykład wielowymiarowy ...

var myObject = new Object(); 
myObject["myValue"]["one"] = "first value"; 
myObject["myValue"]["two"] = "second value"; 
alert(myObject["myValue"]["two"]); //outputs "second value" 

które również mogą być zapisywane jako ...

var myObject = new Object(); 
myObject["myValue"] = {one: "first value", two: "second value"}; 
alert(myObject["myValue"]["two"]); //outputs "second value" 
0

Utworzono funkcję wywoływania nazwanej funkcji. Działa zarówno w przeglądarce, jak i w Node.js. Stworzyłem sedno (https://gist.github.com/netsi1964/3f19bd96f2d6e18bd818), które zawiera również mały test. Odcisk palca tej funkcji to: callFunction(scope, fn, args). Ustawia zakres funkcji na określony zakres, a domyślnie window (w przeglądarce) i global (w Node.js). Aby odpowiedzieć na pierwotną prośbę, użyj go w następujący sposób: callFunction(window, "foo",["test"])