이 참조 문제를 해결할 수 있습니까?
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
결론
자세히 들여다볼수록 그것이 의미가 있다는 것을 더 많이 깨닫게 됩니다. 이것이 왜 저를 혼란스럽게 했는지 모르겠습니다. 아마도 제가 이 상호 작용을 처음 보았을 때 많은 고차원적인 장난이 있었기 때문일 것입니다. 도대체 제가 용어를 올바르게 사용하고 있는지 확신할 수 없지만 제가 이 상호 작용으로 혼란스러워하는 유일한 사람은 아닙니다.
Reference
이 문제에 관하여(이 참조 문제를 해결할 수 있습니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kmyrrpen/true-or-false-using-variables-outside-functions-4a4n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)