2009-08-19 6 views
4

PrototypeJS의 문서 인 : Identity Function을 통해이 주제를 읽었습니다. 내가 좀 더 검색 & 그걸 읽고 난 그 수학적 기초 (예 : 1 곱셈은 신원 기능 (또는 내가 이것을 오해 했나?)),하지만 JS C 또는 무엇이든) 함수 - 함수는 기본적으로 X를 매개 변수로 취하고 return X과 같은 역할을합니다.'신원 기능'의 목적은 무엇입니까?

더 깊은 통찰력이 있습니까? Prototype이이 기능을 제공하는 이유는 무엇입니까? 무엇을 위해 사용할 수 있습니까?

감사합니다 :)

답변

7

은 Identity 기능을 사용하여 읽기 라이브러리 코드가 약간 쉬워집니다. Enumerable#any 방법을 가지고 : 그것은 배열의 요소 중 하나가 부울 컨텍스트에 해당하는 경우 사용자가 점검 할 수있게

any: function(iterator, context) { 
    iterator = iterator || Prototype.K; 
    var result = false; 
    this.each(function(value, index) { 
     if (result = !!iterator.call(context, value, index)) 
     throw $break; 
    }); 
    return result; 
    }, 

.

$A([true, false, true]).any() == true 

그러나 그것은 또한 당신이 진실을 점검하기 전에 각 요소를 처리 할 수 ​​있습니다 :과 같이,

이제
$A([1,2,3,4]).any(function(e) { return e > 2; }) == true 

어떤 기능의 두 가지 버전을 작성해야 식별 기능이없는 하나 당신이 사전 처리한다면, 하나도하지 않으면.

any_no_process: function(iterator, context) { 
    var result = false; 
    this.each(function(value, index) { 
     if (value) 
     throw $break; 
    }); 
    return result; 
    }, 

    any_process: function(iterator, context) { 
    return this.map(iterator).any(); 
    }, 
0

은 그 라이브러리에 대해 잘 모르지만, 일반적으로, 당신은 if (add) (a + b) + x else a + ba + b + (add ? x : 0)로 다시 작성해야처럼, 공통 부분을 감안하여 formuals 또는 코드 또는 무엇이든을 최적화 할 수 있습니다. 당신도 똑같이하려고 유혹을 느낍니다

if (!initialized) initialize(callback_with_very_long_name) else callback_with_very_long_name 

꽤 비슷합니다. 공통 요소 또는 용어를 쉽게 제외 할 수 있지만 함수 응용 프로그램을 어떻게 제외 할 수 있습니까? 당신이 mathematiscs 또는 Hascel을 이해한다면, 당신은

a ? x + v : v 

보이는 것을 볼 수 대단히 같은

a ? f value : value 

당신은 하나의 경우 추가 x가 아닌 다른있다. 한 경우에만 기능을 적용하고 다른 기능에는 적용하지 않습니다. 0을 additive identity (추가 할 때 아무 것도 바뀌지 않음)이기 때문에 (a ? x : 0) + v으로 전자를 최적화하고 v은 여기에 공통적 인 요소입니다. 이는 항상 application of x에 관계없이 발생합니다. 함수 응용 프로그램 (또는 응용 프로그램이 아닌 경우)의 경우 콜백이 공통적 인 요소입니다. 우리는 그것을 배제하고 싶습니다. 아무것도 변경되지 않도록 우리가 적용해야하는 ID 기능이란 무엇입니까? 신원 기능!

(a ? f : identity) value 

입니다. 우리의 원래 예제는 다음과 같습니다.

(initialized ? identity : initialize) (callback_with_very_long_name) 

페이지의 한 행에 맞습니다.

관련 문제