문제

나는 생각하지 않는 한 grokked 변환 yet.을 이해하고 당신이 원하는 무엇이고 어떻게 그것을 할 수 있습니다.나는 그냥 생각할 수 없다의 상황을 나는 그것을 사용합니다.

어디에 당신을 사용하여 변환 JavaScript(또는 곳은 라이브러리는 그것을 사용하는)?DOM 조작 또는 일반 응용 프로그램 개발 예 환영합니다.

중 하나 답변 언급 애니메이션이다.기능 slideUp, fadeIn 는 요소로는 인수 및 정상적으로의 변환 기능을 반환하는 높은 기능을 가진 기본"애니메이션 기능은"내장되어 있습니다.왜 그보다 더 나은 사용자의 높은 기능을 가진 몇 가지 기본값은?

어떤 단점이 있습니다 그것을 사용하여?

로 요청한 여기에 몇 가지 좋은 자원이 자바스크립트로 변환:

추가 더 그들은 농작물에 있습니다.


그렇다면 답변,변환 부분 응용 프로그램에서 일반적으로 편의 기술이 있습니다.

는 경우는 자주"정제하는"이 높은 수준의 함수를 호출하여 그와 동일한 구성할 수 있는 카레(또는 사용 레식의 부분)는 높은 수준의 기록을 만들어 간결하고 소박한 도우미는 방법이 있습니다.

도움이 되었습니까?

해결책

@Hank 게이

에 대응하여 EmbiggensTheMind 의 코멘트:

나는 생각할 수 없는 인스턴스 커링—전체에서 유용 JavaScript;그것은 기술에 대한 변환 함수 호출에 여러 논의 체인으로 함수 호출을 하나의 인수를 위한 각 호출하지만,JavaScript 지원하는 여러 인수 하나의 함수 호출합니다.

에서 자바스크립트 및 가정 대부분의 다른 실제 언어(지 않는 람다 수학)—그것은 일반적으로 연결된 부분 응용 프로그램,하지만.존 레식 더 잘 설명, 하지만,요점이 있는 몇 가지 논리에 적용되는 두 개 또는 그 이상 인수,그리고 당신은 가치를 알고 있(s)에 대한 사람들의 일부는 인수입니다.

당신이 사용할 수 있는 부분 응용 프로그램/변환를 해결하기 위해 알려진 값을 반환하는 기능이만 허용하는 이 미지를 나중에 호출될 때 당신은 실제로 값을 전달할.이 제공하는 멋진 방법은 자신을 반복되었을 때 호출 같은 자바 스크립트 내장 기능 이상과 함께 모든 동일한 값 그러나 하나입니다.을 훔치는 요한의 예:

String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( (results[1] == "Resig") + " The text values were split properly" );

다른 팁

다음 재미 있고 실용적인 사용의 변환에서 JavaScript 를 사용하는 폐쇄:

function converter(toUnit, factor, offset, input) {
    offset = offset || 0;
    return [((offset + input) * factor).toFixed(2), toUnit].join(" ");
}

var milesToKm = converter.curry('km', 1.60936, undefined);
var poundsToKg = converter.curry('kg', 0.45460, undefined);
var farenheitToCelsius = converter.curry('degrees C', 0.5556, -32);

milesToKm(10);            // returns "16.09 km"
poundsToKg(2.5);          // returns "1.14 kg"
farenheitToCelsius(98);   // returns "36.67 degrees C"

이에 의존하 curry 의 확장 Function, 지만,당신이 볼 수있는 그것은 단지 사용 apply (아무것도 너무 멋진):

Function.prototype.curry = function() {
    if (arguments.length < 1) {
        return this; //nothing to curry with - return function
    }
    var __method = this;
    var args = toArray(arguments);
    return function() {
        return __method.apply(this, args.concat([].slice.apply(null, arguments)));
    }
}

내가 찾는 기능을 닮는 파이썬's functools.partial 에서 더 유용한 자바 스크립트:

function partial(fn) {
  return partialWithScope.apply(this,
    Array.prototype.concat.apply([fn, this],
      Array.prototype.slice.call(arguments, 1)));
}

function partialWithScope(fn, scope) {
  var args = Array.prototype.slice.call(arguments, 2);
  return function() {
    return fn.apply(scope, Array.prototype.concat.apply(args, arguments));
  };
}

왜 당신은 그것을 사용하고 싶?일반적인 상황을 사용하려면 이에 바인딩하려는 경우 this 함수에서 값:

var callback = partialWithScope(Object.function, obj);

지금 경우 콜백을 호출, this 포인트 obj.이에 유용한 이벤트 상황 또는 일부를 저장하는 공간 때문에 그것은 일반적으로 만든 코드를 짧아집니다.

변환과 비슷하는 부분의 차이와 함께하는 함수의 변환을 반환합 단지 하나의 인수(지금까지 내가 이해하는).

동 Hank 게이-그것은 매우 유용한 특정 진정한 프로그래밍 언어이기 때문에 필요한 부분입니다.예를 들어,파일에 당신은 단순히 취할 수 없는 여러 매개변수 함수 수행할 수 없는 순수한 기능적인 프로그래밍입니다.당신은 하나의 param 에서 시간과 구축하는 기능입니다.에서 JavaScript 그것은 단순히 불필요한에도 불구하고,인위적인 예는 다음과 같"변환기".여기에는 동일한 코드 변환기위한 필요없이,변환:

var converter = function(ratio, symbol, input) {
    return (input*ratio).toFixed(2) + " " + symbol;
}

var kilosToPoundsRatio = 2.2;
var litersToUKPintsRatio = 1.75;
var litersToUSPintsRatio = 1.98;
var milesToKilometersRatio = 1.62;

converter(kilosToPoundsRatio, "lbs", 4); //8.80 lbs
converter(litersToUKPintsRatio, "imperial pints", 2.4); //4.20 imperial pints
converter(litersToUSPintsRatio, "US pints", 2.4); //4.75 US pints
converter(milesToKilometersRatio, "km", 34); //55.08 km

내가 심하게 원하는 더글러스 Crockford,에서"자바 스크립트:좋은 부분",정의 역사와의 실제 사용 변환기보다는 자신의 offhanded 말입니다.에 대한 가장 긴 시간을 읽은 후에는,나는 샌프란시스코,까지 공부하고 있었는 프로그래밍 및 실현되는 곳입니다.

후에 좀 더 많은 생각,내가 가정이 한 유효한 사용 사례를 위한 변환에서 자바스크립트:하려고 하는 경우 사용하여 작성 순수형 프로그래밍 기법을 사용하여 자바 스크립트.처럼 보인다 희소한 사용 사례는 하지만입니다.

예제는 다음과 같습니다.

나는 계측 필드 와 그래서 나는 것을 볼 수 있는 사용자니다.코드는 다음과 같습니다:

$('#foo').focus(trackActivity);
$('#foo').blur(trackActivity);
$('#bar').focus(trackActivity);
$('#bar').blur(trackActivity);

(을 위한 비 JQuery 사용자,제가 말하는 시간의 몇 분야 또는 얻을 초점을 잃고,내가 원하는 trackActivity()함수가 호출됩니다.나도 사용할 수 있는 익명으로 기능하지만,나는 그것을 중복하는 4 번,그래서 나는 그것을 밖으로 지명합니다.)

지금은 하나의 필드를 할 필요가 다르게 처리됩니다.고 싶을 통과 할 수 있에서 매개 변수 중 하나에 해당 호출을 전달하는 우리의 추적 인프라가 있습니다.와 변환,내가 할 수 있습니다.

마법 또는 아무것도...한 속기 위해 익명능합니다.

partial(alert, "FOO!") 에 해당하는 function(){alert("FOO!");}

partial(Math.max, 0) 에 해당하는 function(x){return Math.max(0, x);}

통화 부분(MochiKit 용어에 기초하고 있습니다.나는 생각한 다른 라이브러리 함수다.카레가하는 방법이 동일한 것)보다 약간 더 좋고 더 적은 시끄러운 것보다는 익명능합니다.

으로 라이브러리를 사용하여,그것은 항상 거기 기능.

을 때는 그것에 유용 JS?아마도 동일한 시간에 유용한 다른 현대적인 언어,하지만 시간이 나는 볼 수 있습니다 나 자신을 사용하여 그것은에서와 함께 부분 응용 프로그램.

내가 말할 것에,대부분의 아마도 모든 애니메이션 라이브러리에서 JS 를 사용하여 변환.하는 것 보다는 통행을 위해 각 통화의 집합에 영향 요소와 기능,는 방법을 설명하는 요소 행동해야 하는지를 높이기 위해 기능으로 모든 타이밍,물건의 일반적으로 쉽게 대한 고객 릴리스로 공개 API 일부 기능은 다음과 같"slideUp","fadeIn"는 요소만으로 인수,그냥 몇 가지 변환 기능을 반환하는 높은 기능을 가진 기본"애니메이션 기능은"내장되어 있습니다.

JavaScript 함수가 호출하는 람에 다른 기능적인 언어입니다.사용될 수 있을 구성하는 새로운 api(더 강력한 또는 complext 기능)을 기반으로 다른 개발자의 단순한 입력.카레이 기술.당신은 그것을 사용할 수 있습을 만드는 간소화된 api 를 호출하는 복잡한 api 를 사용합니다.는 경우에 당신은 사랑을 사용하는 간소화된 api(예를 들어,당신은 jQuery 를 사용하여 간단한 조작),당신은 당신을 사용할 필요가 없다.그러나를 만들려는 경우에는 간소화된 api,카레이 당신의 친구입니다.를 작성해야 합 javascript framework(jQuery 와 같은 mootools 의)또는 도서관,다음을 감상할 수 있습니다.나는 향상된 카레 기능,에 http://blog.semanticsworks.com/2011/03/enhanced-curry-method.html .당신이 필요하지 않 카레 방법을 변환,그것은 단지 도움을 무두질,하지만 당신은 항상 그것을 할 수 있는 수동으로 작성하여 기능(){}반환하는 다른 기능은 B(){}.더 재미있는,함수를 사용 B()를 반환 또 다른 기능은 C().

내가 알고있는 그것의 오래된 스레드 그러나 나는 것입니다 어떻게 이것은 자바 스크립트에서 사용되는 라이브러리:

내가 사용하는 것입 lodash.js 라이브러리를 설명하는 이러한 개념을 구체적으로.

예제:

var fn = function(a,b,c){ 
return a+b+c+(this.greet || ‘'); 
}

부분적인 응용 프로그램:

var partialFnA = _.partial(fn, 1,3);

변환:

var curriedFn = _.curry(fn);

Binding:

var boundFn = _.bind(fn,object,1,3 );//object= {greet: ’!'}

사용법:

curriedFn(1)(3)(5); // gives 9 
or 
curriedFn(1,3)(5); // gives 9 
or 
curriedFn(1)(_,3)(2); //gives 9


partialFnA(5); //gives 9

boundFn(5); //gives 9!

차이:

후 변환 우리는 새로운 기능이 없는 매개변수를 사전에 바인딩.

후에 부분적인 응용 프로그램 우리는 얻을 수있는 기능밖에 없으로 일부를 매개 변수 prebound.

바인딩에서 우리가 할 수 바인딩 컨텍스트하는 것이 대체하기 위해 사용될'이'하지 않을 경우 바인딩 기본값의 모든 기능을 창의 범위가 있습니다.

조언:할 필요가 없 바퀴를 재발견 할 수 있습니다.부분적인 응용 프로그램/바인딩/커링은 매우 많은 관련이 있습니다.당신은 차이를 볼 수 있습니다.이미 어디서나 사람들이 인식하고 당신이 무엇을 하고 있는 문제없이 이해 플러스 당신이 사용하는 것이 더 적은 코드입니다.

내가 합의하는 시간을 좋아하는 볼링을 작성하여 의사능는 항상 있을 것이 값의 첫 번째 인수로 가득합니다.다행히도,내가 나가는 새로운 자바 스크립트 라이브러리 호출 jPaq(http://jpaq.org/ 도)이 기능을 제공합니다.에 대한 가장 좋은 것은 라이브러리는 사실 다운로드할 수 있습니다 자신을 구축하는 코드만을 포함하는 것이 필요합니다.

나는 단지를 썼 jPaq 예를 보여줍니다 몇 가지 멋진 응용 프로그램의 카레 기능입니다.여기에서 확인해 보십시오: 변환까지 문자열 기능

그냥 몇 가지를 추가 리소스 Functional.js:

강/회의 일부를 설명하는 응용 프로그램 http://www.youtube.com/watch?v=HAcN3JyQoyY

업데이트 Functional.js 라이브러리:https://github.com/loop-recur/FunctionalJS 몇 가지 좋은 도우미(유감 여기에 새로운,더 명성:p):/루프 반복/PreludeJS

나는 이 라이브러리를 사용하여 많은 최근을 줄이 반복에 js IRC 도우미 클라이언트 라이브러리입니다.그것은 좋은 물건이 도움이 깨끗하고 단순화하는 코드입니다.

또한,성능한 경우 문제가 되지만(이 lib 은 아름다운 빛),그것은 쉽게 다시 사용하는 기본 기능입니다.

당신이 사용할 수 있습 native 바인딩에 대한 빠르고,한 줄 솔루션

function clampAngle(min, max, angle) {
    var result, delta;
    delta = max - min;
    result = (angle - min) % delta;
    if (result < 0) {
        result += delta;
    }
    return min + result;
};

var clamp0To360 = clampAngle.bind(null, 0, 360);

console.log(clamp0To360(405)) // 45

다른 곳에서 그것과 함께 작업에서 약속입니다.

(면책 조항:JS 멍청한 놈에서 나오는 파이썬다.도,거기에 커링 사용하지 않는 그리 많지만,그것은 편리하게 할 수 있습니다.그래서 나는 본따합 변환 기능-연결되는 링크가 표시되)

첫째,내가 시작으로 ajax call.나는 몇 가지 특정 처리를 수행에 성공을 하지만 실패에는 사용자가 응용 프로그램을 사용하여 문제가 전화 결과 일부 오류.에서 내 실제 코드,표시하고 오류에 의견을 부트스트랩판,하지만 단지를 사용하여 로깅니다 여기에.

나는 수정된 내 라이브 url 을 만들이 실패합니다.

function ajax_batch(e){
    var url = $(e.target).data("url");

    //induce error
    url = "x" + url;

    var promise_details = $.ajax(
        url,
        {
            headers: { Accept : "application/json" },
            // accepts : "application/json",
            beforeSend: function (request) {
                if (!this.crossDomain) {
                    request.setRequestHeader("X-CSRFToken", csrf_token);
                }
        },
        dataType : "json",
        type : "POST"}
    );
    promise_details.then(notify_batch_success, fail_status_specific_to_batch);
}

이제 여기서 얘기하기 위해서는 사용자에게 일괄 실패했을 쓸 필요는 정보에 오류 처리기 때문에,그것은 점점에서 응답 서버입니다.

나는 아직이는 정보 사용할 수 있 코딩에서 시간을 내 경우에는의 수는 가능한 한 일괄지만,내가 알지 못하는 한가지 못했습니다.o.분석 서버의 응답에 대한 실패한 url 을 입력합니다.

function fail_status_specific_to_batch(d){
    console.log("bad batch run, dude");
    console.log("response.status:" + d.status);
}

의 그것을 할 수 있습니다.콘솔 출력입니다:

콘솔:

bad batch run, dude utility.js (line 109) response.status:404

지금의 변화는 것을 조금 사용하고 재사용할 수 있는 일반적인 오류 처리기뿐만 아니라,하나는 카레 런타임으로 알려진에 코드를 호출 시간 컨텍스트와 실시간 정보를 사용할 수 있에서의 이벤트입니다.

    ... rest is as before...
    var target = $(e.target).text();
    var context = {"user_msg": "bad batch run, dude.  you were calling :" + target};
    var contexted_fail_notification = curry(generic_fail, context); 

    promise_details.then(notify_batch_success, contexted_fail_notification);
}

function generic_fail(context, d){
    console.log(context);
    console.log("response.status:" + d.status);
}

function curry(fn) {
     var slice = Array.prototype.slice,
        stored_args = slice.call(arguments, 1);
     return function () {
        var new_args = slice.call(arguments),
              args = stored_args.concat(new_args);
        return fn.apply(null, args);
     };
}

콘솔:

Object { user_msg="bad batch run, dude. you were calling :Run ACL now"} utility.js (line 117) response.status:404 utility.js (line 118)

더 일반적으로,주어진 어떻게 광범위한 콜백을 사용법은 JS,변환 것처럼 매우 유용한 도구입니다.

https://javascriptweblog.wordpress.com/2010/04/05/curry-cooking-up-tastier-functions/ http://www.drdobbs.com/open-source/currying-and-partial-functions-in-javasc/231001821?pgno=2

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top