자바 스크립트를 배우고 있는데 이해할 수없는 것이 많습니다. 한 온라인 JavaScript 퀴즈에서 다음과 같은 질문이 나타났습니다.
다음 JavaScript 코드가 콘솔에 기록되는 것은 무엇입니까?
const a = {};
const b = () => a.a = () => {};
const c = c => '' + c + a.a(b());
const d = console.log.bind(console);
const e = (e => () => d(c(e++)))(0);
try{
e();
}catch(a){
e();
}
각 변수 (여기서는 상수)가 무엇을 의미하는지 이해하는 데 시간이 걸렸습니다. e()
내부 try
블록 에서 코드를 분석하기 시작했습니다 . 그래서, e
그 기능은 의미 폐쇄 나타내는 d
인수로 호출됩니다 c(0)
및 e
이 될 것이다 1
. 내가 이해했듯이, 여기 d
기본적으로 console.log
함수를 나타냅니다 (그러나 왜 그들이 bind
? 를 사용했는지 알 수 없습니다 ).
지금은 먼저 실행 c(0)
되고 결과가 콘솔에 기록 된다는 것을 알고 있습니다 . function을 살펴 보겠습니다 c
. 문자열로 변환 된 첫 번째 인수와의 연결된 결과를 반환합니다 a.a(b())
. 그럼 a.a(b())
먼저 실행하겠습니다. 맞나요? 그러나 문제는 a.a
함수가 아니고 정의되지 않았기 때문에 오류가 발생하고 catch
.
이제 catch
블록에서 모든 것이 동일해야하므로 a.a
여전히 함수가 아니며 참조 오류가 발생해야합니다. 그러나 오류가 발생하지 않는 것을 보았을 때 놀랐지 만 콘솔은 실제로 1undefined
. 왜? 어떻게?
좋아, 약간의 생각 끝에 나는 아마도 호출 할 때 a.a(b())
아마도 b()
먼저 실행 된다는 것을 깨달았다 . 내 가정에 따라 함수 는 object의 b
속성 a
에 아무것도하지 않는 함수에 대한 참조를 지정합니다 a
. 그러나 a.a
IS는 함수이고 try
블록 에서 실행되고 0undefined
기록됩니다.
그러나이 두 가지 가정 중 어느 것도 옳지 않습니다. 여기서 주요 질문은 무엇을 먼저 실행합니까? 전화 someObject.propertyWhichIsNotAFunction(somethingWhichMakesItAFunction)
하면 어떻게 되나요? 무엇을 먼저 실행합니까? try
블록에서 하나는 먼저 실행되고 catch
다른 것은 실행되는 것 같습니다 . 정말 말이 안 돼요. 설명이 있습니까?
이것은 foo.x = foo = {n : 2}에서 foo.x의 값이 정의되지 않은 이유 와 매우 유사합니다 . , 실행시 TypeError가 발생할 때 의존하기 때문에 약간 까다 롭습니다.
기본적으로 일어나는 일은 다음과 같습니다.
a.a
나중에 3 단계에서 어떤 함수가 호출 될지 알아보기 위해 평가됩니다 .b()
함수 인수이고 반환 값이 a.a
평가 대상에 대한 실제 인수가되므로 평가됩니다.a.a
단계 1의 리턴 값으로 실행에 따라 평가 b()
인수로서.사양의 관련 부분은 다음과 같습니다. https://www.ecma-international.org/ecma-262/7.0/index.html#sec-function-calls
함수가 호출 될 때 발생하는 첫 번째 일은 다음과 같습니다.
- 하자 심판 MemberExpression 평가의 결과.
- func 가 되자 ? GetValue (ref).
즉, a.a
평가되고 참조하는 함수가 호출 func
됩니다. 주위에 처음 a.a
으로 평가가 undefined
너무 func
이다 undefined
및 형식 오류는 2 단계에서 발생한다 https://www.ecma-international.org/ecma-262/7.0/index.html#sec-evaluatedirectcall 이다 후의 ArgumentListEvaluation(arguments)
어느 를 호출 b()
하고에 새 값을 할당 a.a
하지만 값 뒤에는 없습니다 func
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다