2016-06-02 3 views
0

함수를 입력으로 사용하는 API가 있고, 함수가 아직 배열에 추가되지 않은 경우 API에 의도적으로 함수를 배열에 추가합니다.자바 스크립트의 함수 비교

API에 대한 호출의 형식입니다

:

myApiHandle.addIfUnique(function(){ 
    myResource.get(myObj); 
}); 

이 API는 다음과 같습니다

이제
myApiHandle.addIfUnique(myFunc) { 
    if (myArray.indexOf(myFunc) === -1) { 
     return; 
    } 
// add to array 
} 

예상대로이 분명 할 때마다 이후 새로운 기능이 전달되는 작동하지 않습니다 in.

내 질문은 : myApiHandle.addIfUnique 호출에 함수를 전달하면이 함수를 사용하여 배열의 기존 함수를 비교할 수 있습니까? 현재 전달되고 있습니까? 비교는 함수 이름과 객체를 비교해야하며 둘 다 같으면 함수를 배열에 추가하지 마십시오. 가능하다면 addIfUnique 호출에 또 다른 인수를 추가하는 것을 피하고 싶습니다. 그렇다면

myApiCall.addIfUnique (someFunc) { 
} 

의 someFunc 것입니다 : 즉

은 가능 이하입니다. 함수가 이미 myArray에 존재하는지 여부를 감지하는 API 내부의 로직은 무엇입니까?

+2

indexOf를 사용하는 것처럼 기능이 있는지 확인할 수 있습니다. 하지만 동일한 함수를 여러 번 만들지 않기 위해 addIfUnique를 호출하는 코드를 업데이트 할 수 있습니다. –

+3

이것은 기본적으로 나쁜 일입니다. 문제를 다른 방식으로 해결하십시오. 두 개의 다른 함수가 실제로 같은 실행인지 다른 실행인지를 구분할 방법이 없습니다.분명히 똑같은 코드를 가지고 있다면 똑같은 결과를 낳 겠지만 코드가 다르면 다른 결과를내는 것은 아닙니다. 나는 당신이 그들을 비교하기를 원할 때마다 매번 새로이 생성되는 지역 함수에서 멈추지 말라고 말하고 싶다. – jfriend00

+0

동의합니다. 해결하려는 문제는 무엇입니까? –

답변

0

같은 문제를 제거하고 addEventListenerremoveEventListener 콜백 동일해야합니다 (=== 의미)에 대한 removeEventListener 발생. 당신이 발견 한 것처럼

는 분명이 같은 addIfUnique를 호출하는 경우 :

addIfUnique(function() { }) 

함수마다 고유의 객체가 될 것이다 통과했다. 이 솔루션은 한 번 함수를 만드는 것입니다 :

var fn = function() { }; 
addIfUnique(fn); 
addIfUnique(fn); 

함수에 전달되는 경우 이와 관련된 문제가 발생이 메소드 호출이다, 그래서 그것을 결합해야합니다 나는를 전달하려는

var x = { val: 42, method: function() { console.log(this.val); } }; 

addIfUnique(x.method.bind(x)); 
addIfUnique(x.method.bind(x)); 

그러나 다시 x.method.bind(x)을 호출하면 별도의 기능이 반환됩니다. 따라서 사전 바인딩이 필요합니다.

var boundMethod = x.method.bind(x); 
addIfUnique(boundMethod); 
addIfUnique(boundMethod); 
0

우선 기능 비교는 의미가 없습니다. 두 기능이 문자 그대로 다르더라도 기능적으로 동일 할 수 있습니다.
그리고 문제가 무엇인지 정확히 비교할 수 있습니다. 그렇지 않으면 toString() 함수와 regExp를 사용하여 문자 그대로 비교할 수 있습니다.

var addIfUnique = (function() { 
    var arr = []; 
    return function(func) { 
    if (~arr.indexOf(func)) return false; 
    var nameArr = []; 
    var funcName = func.name; 
    var funcRegExp = new RegExp('[^\{]+\{(.+)\}$', 'i'); 
    var funcStr = func.toString().match(funcRegExp); 
    funcStr = funcStr && funcStr[1]; 
    if (!funcStr) return false; 
    var strArr = arr.map(function(v){ 
     nameArr.push(v.name); 
     return v.toString().match(funcRegExp)[1]; 
    }); 
    if (~strArr.indexOf(funcStr) && ~nameArr.indexOf(funcName)) return false; 
    arr.push(func); 
    }; 
}()); 
관련 문제