2016-08-24 108 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)); 
相关问题