[js] functie een variabele functie laten aanroepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Hoi,

Ik probeer een functie te maken die aan de hand van een variabele bepaalt welke functie er wordt uitgevoerd. Even wat code:
code:
1
2
3
4
5
6
7
8
9
10
function functieaanroeper ( action ) {

        if ( action && typeof action == 'function' ) { action; }
        else if ( action ) { alert ( action + " not a function!"); }

}

functieaanroeper(alert("test1));

functieaanroeper(function() { alert("test2"); });


De eerste test wordt ge-alert, de tweede niet. Maar ik zou toch wel graag willen dat ie dat doet ;)

Iemand een idee?

Acties:
  • 0 Henk 'm!

Verwijderd

Je hebt het helemaal verkeerd begrepen.

De eerste functie wordt aangeroepen vóórdat de functie functieaanroeper wordt aangeroepen. De alert vindt plaats, de functie returnt void (ofwel undefined). De functie functieaanroeper krijgt als argument undefined mee, de if ( action && ... is dus niet waar, en else if ( action ) { ... ook niet. In het eerste geval doet de functie dus niets.

In het tweede geval wordt er wel degelijk een functie aan de functie functieaanroeper doorgegeven. De eerste if evalueert naar true en daarna wordt uitgevoerd: action;. Dat is een pointer naar een functie die je op de stack stopt, maar waar je verder niets mee doet. Er gebeurt dus niets. Als je action (); ervan maakt wordt de functie geëvalueerd en wordt "test2" ge-alert.

Maar denk er dus om: deze functie doet bij je eerste aanroep absoluut niet wat jij verwacht!

Acties:
  • 0 Henk 'm!

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 14-09 14:42

dominic

will code for food

Just a thought: Je zou ook eens naar de eval() functie kunnen kijken, deze accepteert een string waarde waar javascript in mag staan.

Download my music on SoundCloud


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-09 20:59
dominic schreef op maandag 21 juli 2008 @ 19:17:
Just a thought: Je zou ook eens naar de eval() functie kunnen kijken, deze accepteert een string waarde waar javascript in mag staan.
Waarom wordt dit altijd standaard aangedragen, zeker in JavaScript zijn er genoeg (betere!) alternatieven. Zie ook Don't be eval(), waar geen eval te gebruiken.

If I can't fix it, it ain't broken.


Acties:
  • 0 Henk 'm!

  • funkwurm
  • Registratie: December 2005
  • Laatst online: 22-02-2021
Ik doe meestal zoiets:
JavaScript:
1
2
3
4
5
function doe(dit, arg) {
  window[dit](arg);
}
// ...
doe('alert', 'Hello World!');

Is wat minder evil dan eval().

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 22-09 16:31
funkwurm schreef op dinsdag 22 juli 2008 @ 06:48:
Ik doe meestal zoiets:
JavaScript:
1
2
3
4
5
function doe(dit, arg) {
  window[dit](arg);
}
// ...
doe('alert', 'Hello World!');

Is wat minder evil dan eval().
Dan geef ik toch de voorkeur aan functies, die zijn een stuk wijder inzetbaar (en behoeven bijvoorbeeld geen globale definitie).

JavaScript:
1
2
3
4
5
6
7
function doe (f, a) {
    f(a);
}

doe (alert, 'test');

doe (function(t){alert(t)}, 'test2');

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:40

crisp

Devver

Pixelated

En geschikt voor meerdere argumenten ala PHP's call_user_func:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function call_user_func(f)
{
    func = typeof f == 'string' ? window[f] : f;

    if (typeof func == 'function')
    {
        return func.apply(null, [].slice.call(arguments, 1));
    }

    alert((f && f.toString ? f.toString() : f) + ' is not a function');

    return false;
}

function foo(a, b)
{
    alert('arguments: a=' + a + ', b=' + b);
}

call_user_func('foo', 'aap', 'noot');
call_user_func(foo, 'mus', 'pim');
call_user_func('bar', 'roos', 'vuur');


:)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 22-09 16:31
JavaScript:
1
[].slice.call(arguments, 1)


Nice, die kende ik nog niet. Scheelt een hoop 'geclone'.

[ Voor 15% gewijzigd door Bosmonster op 22-07-2008 11:52 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:40

crisp

Devver

Pixelated

Bosmonster schreef op dinsdag 22 juli 2008 @ 11:51:
JavaScript:
1
[].slice.call(arguments, 1)


Nice, die kende ik nog niet. Scheelt een hoop 'geclone'.
http://crisp.tweakblogs.n...owser-array-generics.html ;)

note btw dat je niet zomaar elke array method op 'array-like' objecten kan loslaten. Het werkt toevallig crossbrowser voor het arguments object (wat eigenlijk van meet af aan al een array had moeten zijn imo), maar met name voor interface objecten (NodeLists e.d.) ymmv (needless to say dat vooral IE daar dwarsligt).

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 22-09 16:31
crisp schreef op dinsdag 22 juli 2008 @ 11:58:
[...]

http://crisp.tweakblogs.n...owser-array-generics.html ;)

note btw dat je niet zomaar elke array method op 'array-like' objecten kan loslaten. Het werkt toevallig crossbrowser voor het arguments object (wat eigenlijk van meet af aan al een array had moeten zijn imo), maar met name voor interface objecten (NodeLists e.d.) ymmv (needless to say dat vooral IE daar dwarsligt).
Bedoel je dat ik vaker je blog moet gaan lezen? :P

Heb hem zelfs gebookmarked nu!

/offtopic
Pagina: 1