2016-08-24 6 views
0

Ich habe eine Funktion, die eine andere Funktion als param accpets:Pass-Funktion in der JavaScript-Funktion aufruft 2. Funktion sofort

Function Call

openDialog('warning',removeRowAction(id)); 

Opendialog Funktion

function openDialog(type, action){ 
if(type == 'warning'){ 
    action(); 
}else{ 
    console.log(type); 
} 
} 

removeRowAction Funktion

function removeRowAction(row){ 
    $('#row_'+row).remove(); 
} 

Leider ist die removeRowAction(id) immediatley genannt, egal welche type ich habe und noch vor dem if.

Ist das was ich machen möchte auch möglich?

+3

Nun, 'removeRowAction (id)' ruft die Funktion. JavaScript evaluiert eifrig Argumente. Also wird 'foo (bar())' zuerst 'bar' aufrufen und seinen Rückgabewert an' foo' übergeben. Wenn Sie eine Funktion übergeben wollen, tun Sie das: 'function() {removeRowAction (id); } '. –

Antwort

2

Das Problem ist, dass Sie removeRowAction sind anrufen, wenn Sie es openDialog passieren. Sie möchten eine Funktion, die eine Funktion, wie folgt zurückgibt:

function removeRowAction(row){ 
    return function() { 
     $('#row_'+row).remove(); 
    } 
} 

openDialog('warning',removeRowAction(id)); 

So können Sie jede id verwenden, die Sie überall in Ihrem Code möchten.

+0

Ich denke, alle anderen mögen auch funktionieren, aber ich mag diese, da sie am logischsten/saubersten ist! – PrimuS

1

Sie übergeben keine Funktion an OpenDialog, aber den Rückgabewert von removeRowAction (id).

Sie könnten eine Funktion wie diese passieren:

openDialog('warning',function(){removeRowAction(id)}); 
0
openDialog('warning' , id); 

function openDialog (type , id) { 
    type == 'warning' ? 
    removeRowAction(id) : 
    console.log(type) ; 
} 

function removeRowAction (row) { 
    $('#row_' + row).remove(); 
} 
0

Nun gibt es mehrere Möglichkeiten:

Verwenden Function.prototype.bind(), die eine neue Funktion zu erstellen:

Die bind() -Methode erstellt eine neue Funktion, die, wenn dieses Schlüsselwort seines namens auf den angegebenen Wert setzen, wobei eine bestimmte Folge von Argumenten vor allen angegebenen steht, wenn die neue Funktion aufgerufen wird.

openDialog('warning',removeRowAction.bind(null, id)); 

Pass eine Funktion zum openDialog Methode:

//ES5 syntax 
openDialog('warning', function() { 
    removeRowAction(id) 
}); 

//ES2015 syntax 
openDialog('warning',() => removeRowAction(id)); 

Sie können auch das Prinzip der Schließung verwenden. So Ihre Funktion removeRowAction eine Funktion zurück und wird diese Funktion Zugriff auf die Zeilenvariable haben:

//ES5 
function removeRowAction(row){ 
    return function() { 
     $('#row_'+row).remove(); 
    } 
} 

//ES2015 
function removeRowAction2(row){ 
    return() => $(`#row_${row}`).remove(); 
} 

//same call with removeRowAction2 
openDialog('warning', removeRowAction(id)); 
Verwandte Themen