2016-08-24 5 views
0

내가 가지고 PARAM으로 다른 기능을 accpets 기능 :패스 기능은 2 차 함수를 호출 즉시

함수 호출

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) 상관없이 나는 심지어 if 전에 무엇을 type, immediatley 호출되지 않습니다.

내가 할 수있는 일이 가능한 것일까 요?

+3

음,'removeRowAction (ID)를'함수를 호출합니다. JavaScript는 열심히 인수를 평가합니다. 따라서'foo (bar())'는'bar'를 먼저 호출하고 반환 값을'foo'에 넘깁니다. 함수를 전달하려면 다음과 같이하십시오. function() {removeRowAction (id); }'. –

답변

2

문제는 당신이 openDialog에 전달할 때 removeRowAction를 호출하고 있다는 점이다.

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() 새로운 기능을 만들 :

바인드를() 메소드 호출시의이 키워드를 가진 새 함수를 만듭니다 제공된 값으로 설정하고 새 함수가 호출 될 때 제공된 인수 앞에 주어진 인수 시퀀스가 ​​제공됩니다.


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));