이 참조 문제를 해결할 수 있습니까?

4335 단어 beginnersjavascript
let foo = () => {}
let bar = () => foo
foo = bar
foo === bar() // ???

const를 사용하여 항목을 너무 오랫동안 선언했거나 불변성에 익숙했다면 내가 했던 것처럼 잘못 이해하고 있는 자신을 발견할 수 있습니다.

정답은 true 입니다. bar()foo가 있었던 이전 함수가 아니라 동일한 함수를 참조합니다. 위의 예를 개체로 바꾸면 비교가 false 이 되기 때문에 이제 이상하다는 것을 알았고 함수가 약간 다른 것과 관련이 있다고 생각했습니다.

let foo = {}
let bar = { x: foo }
foo = bar
foo === bar.x // false


개체를 사용하면 bar.x가 빈 개체를 가리키고 있음을 알 수 있습니다. 참조를 저장하는 대신 foo가 가리키는 값을 사용하여 x에 할당하기 때문에 이는 의미가 있습니다.

즉, 함수 내에서 변수를 사용할 때 참조가 가리키는 것을 사용하는 대신 참조를 사용한다는 의미입니다. 이제는 많은 사용자에게 명백할 수 있지만(모두는 아니길 바랍니다) 변수를 다시 선언하지 않는 데 익숙하다면 이 상호 작용을 본 적이 없거나 잊었을 수 있습니다.

다른 블록으로



그러나 함수만이 아니라 모든 재실행 가능한 블록이 이 작업을 수행합니다. 예를 들면 다음과 같습니다.

let b = 0;
while (b < 10) {
  console.log(b)
  b += 1
}


위의 루프가 제대로 작동하려면 b 내부의 console.log() 포인터가 가리키는 것이 아니라 포인터여야 합니다.

지연된 실행



이는 setTimeout를 사용하여 약속 및 지연된 실행에서도 발생합니다.

let a = 0;
new Promise((res, rej) => {
    let b = 10
    setTimeout(() => {
        b = a;
        res(b)
    }, 300)
}).then(val => console.log(val)) // this will be 40
a = 40


결론



자세히 들여다볼수록 그것이 의미가 있다는 것을 더 많이 깨닫게 됩니다. 이것이 왜 저를 혼란스럽게 했는지 모르겠습니다. 아마도 제가 이 상호 작용을 처음 보았을 때 많은 고차원적인 장난이 있었기 때문일 것입니다. 도대체 제가 용어를 올바르게 사용하고 있는지 확신할 수 없지만 제가 이 상호 작용으로 혼란스러워하는 유일한 사람은 아닙니다.

좋은 웹페이지 즐겨찾기