2016-08-24 110 views
0

我有accpets其他功能設置了一個param功能:傳遞函數在JavaScript函數調用第二函數立即

函數調用

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

openDialog功能

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

removeRowAction功能

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

不幸的是,removeRowAction(id)被稱爲immediatley,不管我有什麼type甚至if之前。

我甚至想做甚麼?

+3

好吧,'removeRowAction(ID)'調用函數。 JavaScript急切地評估參數。所以'foo(bar())'會先調用'bar'並將其返回值傳遞給'foo'。如果你想傳遞一個函數,然後做到這一點:'function(){removeRowAction(id); }'。 –

回答

2

的問題是,你打電話removeRowAction當你把它傳遞給openDialog。你想返回功能,這樣的功能:

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

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

這將讓你使用你在你的代碼的任何地方想要的任何id

+0

我認爲所有其他人也可以工作,但我喜歡這個,因爲它是最合乎邏輯/乾淨的! – PrimuS

1

您沒有將函數傳遞給openDialog,而是removeRowAction(id)的返回值。

你可以通過這樣的函數:

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

嗯,有幾個選項:

使用Function.prototype.bind()它創建一個新的功能:

的bind()方法創建一個新的函數,調用它時,有此關鍵字設置爲提供的值,並在調用新函數時提供的任何前面給定的參數序列。

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

傳遞一個函數到openDialog方法:

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

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

您還可以使用封閉的原則。所以,你的功能removeRowAction會返回一個函數,這個函數將有機會獲得行變量:

//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)); 
相關問題