1

예 : 우리의 JavaScript 코드는대체 모델이 클로저에서 작동합니까? 아니면 환경 모델이 필요합니까?

let a = x => { 
    let y = x * 2 
    return z => x + y + z 
} 
let b = a(1) 
let c = b(2) 

대체 모델을 사용하여 이것을 평가할 수 있습니까?

let c = ((x => { 
    let y = x * 2 
    return z => x + y + z 
})(1))(2) 

을하지만 (2 호출) 외부 표현식을 평가하기 전에 다음 나는 (1 호출) 내부 표현식을 평가해야합니다 :

나는과 같이 시작했다. 그러나 대체를 위해 항상 외부에 있습니다.

대체 모델이 부적절하다는 표시입니까? 또는 내부에서뿐만 아니라 외부에서 평가하는 것이 더 정열적입니까? 아니면 그것을 볼 수있는 다른 방법이 있습니까?

+1

코드가 바운드 범위 변수를 변경하지 않는 경우 환경 모델이 필요하지 않습니다. – Bergi

+1

순수한 함수에서 평가 순서는 중요하지 않습니다. 그러나 외부에서도 응용 프로그램 작업의 왼쪽면을 적용하기 전에 함수로 평가해야합니다. – Bergi

답변

3

대체 모델은 폐쇄에 사용됩니다. 기본적으로 바인딩을 바인딩 된 값으로 바꿉니다. 환경 모델이 필요하지 않습니다.

const b = a(1)     // == 
const b = z => 1 + (1 * 2) + z 

const c = b(2)    // == 
const c = 1 + (1 * 2) + 2 // == 
const c = 5    

당신이 정말로 당신이 환경 모델을 필요로하는 곳에 (경우에 당신이 실제로 바인딩) let를 사용해야 할 경우에만입니다.

평가 순서에 관해서는 a(1)(2)과 같은 두 번의 호출에서 의 결과로 호출되기 때문에 먼저 2이라는 인수로 두 번째 호출을 수행 할 수 없음이 분명합니다. 따라서 a(1)의 결과를 알아야하므로 먼저 그 값을 대체해야하며 그 결과에 대해 다음 호출을 수행해야합니다.

let c = (x => { 
    let y = x * 2 
    return z => x + y + z 
})(1)(2) 
// substituting 1 for x ==> 
let c = (z => 1 + 2 + z)(2) 
// substituting 2 for z ==> 
let c = 1 + 2 + 2 
+0

알겠습니다. 대체 작업의 순서는 무엇입니까? 아이디어를 내외부 또는 밖에서 평가하면 상관 없습니다. 어느 쪽이든 동일한 결과를 얻을 수 있기 때문입니다. – bcherny

+0

@bcherny 답변에 추가했습니다. – Sylwester

+0

알겠습니다 - 감사합니다! – bcherny