2014-10-30 3 views
5

나는자바 스크립트에서 함수 호출에 임의의 체인을 달성하는 방법?

sum(1)(2) //3 
코드처럼 보이는

달성하기 위해 코드를 작성했습니다 :

function sum(a) { 

    return function(b) { 
    return a+b 
} 

} 

을하지만 체인 함수 호출의 임의의 수를 달성하는 방법은 두 번째 질문을 밖으로 작동하지 않았다 같은 :

sum(1)(2) == 3 
sum(5)(-1)(2) == 6 
sum(6)(-1)(-2)(-3) == 0 
sum(0)(1)(2)(3)(4)(5) == 15 

답변

9

일반적으로 당신이 뭔가를 할 것

sum(1,2,3,4); // 10 

을하지만 당신이 후하고있는 기능을 해킹 할 수 있습니다 :

var sum = function(x){ 
    var f = function(y){ 
     return sum(x+y); 
    }; 
    f.valueOf = function(){ 
     return x; 
    }; 
    return f; 
}; 

sum(1)(2)(3)(4); // 10 

그냥 프로덕션 코드에서 수행하지 마십시오.

+0

이것은 매우 영리하다. 당신의 대답이 암시하는 것처럼 실제 사용에 너무 영리합니다. 그럼에도 불구하고, 그것은 정확하고 매우 생각을 자극합니다. –

+0

매우 인상적인 대답입니다. – bean

1

당신이 할 수 없어 - 어떻게 sum 기능은 당신이 대답하거나 다른 기능을 반환할지 여부를 알 수 있을까를?

당신은 생각이 라인을 따라 뭔가를 할 수 :

sum(0)(1)(2)(3).result() 

는 다음과 같이 구현 :

var sum = (function(){ 
    var total = 0; 
    var f = function(n){ 
     total += n; 
     return f; 
    }; 
    f.result = function(){ 
     return total; 
    }; 
    return f; 
}()); 
+0

thx하지만 책에 관한 질문이므로 어떻게 든 할 수 있다고 생각합니다. – bean

+1

당신이 찾으면 대답을 보려는 데 매우 흥미가있을 것입니다. 함수 인 숫자를 반환해야 할 것 같아요. – codebox

+0

@codebox 반환 된 함수의 valueOf 메서드를 대체하는 mintsauce의 대답을 참조하십시오. –

1

사용자로서 codebox 이미 말했다 : 이것은 불가능합니다.

대신 수행 할 수있는 작업은 함수의 현재 매개 변수를 고려하는 것입니다. 어떤 매개 변수가없는 경우에 당신은 결과를 반환 할 수 있습니다

var sum = (function() { 
    var total = 0; 
    return function add(a) { 
     if(a === undefined) { 
      return total; 
     } 
     total += a; 
     return add; 
    }; 
}()); 
+0

그가 내보다 더 요구하는 것에 더 가깝다. – codebox

0

함수에 인수의 "임의의"양을 전달하는 다른 방법의 소수있다 : 여기

sum(1)(2)() == 3 

의 구현입니다. 아마도 가장 유용한 것은 arguments 개체입니다. 모든 함수의 범위에서 함수에 전달 된 모든 인수를 보유하는 배열과 같은 객체가 있습니다. 이 기능처럼 보이는에도 불구하고

function shout(msg) { 
    for (var i = 0; i < arguments.length; i++) 
     console.log(arguments[i]); 
} 

shout("This", "is", "JavaScript!"); // Logs all three strings, one line at a time 

는 하나 개의 인수를 받아, 당신은 당신이 원하는만큼 많은, 그들 모두를 통해 기능 의지주기에 연결할 수 있습니다. 따라서, 귀하의 코드를이 변환 :

function sum(a) { 
    var total = 0; 

    for (var i = 0; i < arguments.length; i++) 
     total = total + arguments[i]; 

    return total; 
} 

sum(1, 2); // Returns 3 

두 가지주의 할 :

  • 당신이 인수가 객체에 접근하고 있기 때문에, 당신은 정말하지 "필요"를에 인수 목록의 모든 종류의 작업을 수행 함수 정의 (즉, sum(a)에는 a이 필요하지 않습니다). 일반적으로 함수가 예상하는 바를 표시하는 것이 좋습니다.
  • arguments 객체는과 같은 배열 -이지만 실제 배열은 아닙니다. 당신이 물건을 엉망으로 만들고 싶지 않으면 push 나 pop과 같은 배열 함수를 사용하려고하지 마십시오.

특정 sum(1)(2) 구문에 대한 - 그러나 그것이 매우 구체적으로 필요한 경우 - 나는 혼란 스럽습니다. 이론적으로, 이와 같은 임의 체인을 사용하려면 인 객체를 반환하는 함수가 필요합니다.은 JavaScript의 기본 규칙을 위반하는 함수 및 숫자입니다. 나는 그렇게하는 것이 매우 좋은 이유가 없다면 일반적으로 눈살을 찌푸리게되는 내장 된 객체에 대한 극도로 영리한 (그리고 매우 위험한) 편집 작업 없이는 가능하지 않다고 생각합니다.

var add = function(a,b){ 
    return a+b; 
}; 

var sum = function(){ 
    return [].reduce.call(arguments, add); 
} 

을 그리고 당신은 쓸 수 있습니다 :

관련 문제