JavaScript 의 역할 도 메 인 체인 을 전면적으로 이해 합 니 다.
7162 단어 JavaScript도 메 인 체인
이것 은 매우 중요 한 지식 포인트 입 니 다.자바 스 크 립 트 의 역할 도 메 인 체인 을 이해 하면 우리 가 많은'이상'문 제 를 이해 하 는 데 도움 을 줄 수 있 습 니 다.
앞에서 내 가 말 한 성명 이 앞 당 겨 진 작은 예 를 살 펴 보 자.
var name = 'Skylor.min';
function echo() {
alert(name);
var name = 'mm';
alert(name);
alert(age);
}
echo();
이 예 에 대해 이런 부분 을 접 해 본 적 이 없 을 때 첫 번 째 반응 은 고민 할 것 입 니 다.이 첫 번 째 name 은 전체 변수의 name 을 호출 하 는 것 입 니까?함수 내부 의 name 을 호출 하 는 것 입 니까?전체 국면 을 호출 하 는 것 입 니까?그러나 함수 내부 도 정의 와 할당 을 사용 합 니 다.함수 내부 의 부분 변 수 를 호출 하면 그의 값 은 mm 입 니까?아니면 전체적인'Skylor.min'을 인용 할 까요?그래서 이 작은 예 에는 이런 잘못된 답 이 있다.
Skylor.min
mm
[대본 오류]
사실은 그렇지 않 습 니 다.함수 안의 미리 설명 을 알 면 이것 이 정확 하지 않다 는 것 을 알 수 있 습 니 다.
undefined
mm
[스 크 립 트 오류]
그래 야 한다.그렇다면 왜 이 답 일 까?미리 밝 히 는 것 은 무엇 일 까?모든 것 은 자바 스 크 립 트 의 역할 도 메 인 체인 과 관련된다.
의 원리
먼저 자바 스 크 립 트 의 역할 영역 원리:
자 바스 크 립 트 의 권위 적 인 안내서 에는 자 바스 크 립 트 의 함수 가 정 의 된 역할 영역 에서 실행 되 는 것 이지,실행 되 는 역할 영역 에서 실행 되 는 것 이 아니다.
또한 자바 스 크 립 트 에서 매우 중요 한 개념 이 있 습 니 다.그것 은 바로 자바 스 크 립 트 에서 모든 것 이 대상 이 고 함수 도 마찬가지 입 니 다.
JS 에 서 는 역할 영역의 개념 과 다른 언어 차이 가 많 지 않 습 니 다.한 함 수 를 호출 할 때마다 한 함수 내의 역할 영역 에 들 어 갑 니 다.함수 에서 돌아 온 후에 호출 전의 역할 영역 으로 돌아 갑 니 다.
JS 의 문법 스타일 은 C/C+와 유사 하지만 역할 영역의 실현 은 C/C++와 다 릅 니 다.'스 택'방식 이 아니 라 목록 을 사용 합 니 다.구체 적 인 과정 은 다음 과 같 습 니 다(ECMA 262 에서 말 한 것).
var func = function(lps, rps){
var name = 'Skylor.min';
........
}
func();
func 의 정의 문 구 를 실행 할 때 이 함수 대상 의[scope]속성(내부 속성,JS 엔진 만 접근 할 수 있 지만 FireFox 의 엔진(Spider Monkey 와 Rhino)은 개인 속성 을 제공 합 니 다parent__방문 하여 물 어보 기)이[scope]속성 을 정의 하 는 역할 도 메 인 체인 에 연결 합 니 다.(나중에 자세히 소개 합 니 다)이 때 는 func 가 전체 환경 에 정의 되 어 있 기 때문에 이[scope]는 전체 활동 대상 window active object 만 가리 키 고 있 습 니 다.
func 를 호출 할 때 이벤트 대상 을 만 듭 니 다.이 함수 에 명 시 된 모든 부분 변수 와 함수 정의 에 대해 서 는 이 활동 대상 의 동명 의 이름 속성 입 니 다.
그 다음 에 호출 매개 변 수 를 형 매개 변수 에 부여 하고 부족 한 호출 매개 변 수 는 undefined 입 니 다.
그리고 이 활동 대상 을 scope chain 의 최 전단 으로 하고 func 의[scope]속성 이 가리 키 는 것 을 func 시의 최상 위 활동 대상 을 정의 하여 scope chain 에 추가 합 니 다.
위의 역할 도 메 인 체인 이 있 습 니 다.식별 자 분석 이 발생 할 때 현재 scope chain 목록 의 모든 활동 대상 의 속성 을 역방향 으로 조회 하고 같은 이름 을 찾 으 면 돌아 갑 니 다.찾 을 수 없습니다.바로 이 식별 자가 정의 되 지 않 았 습 니 다.
함수 대상 의[scope]속성 은 함 수 를 정의 할 때 결정 되 는 것 이지 호출 할 때 가 아니 기 때문에 아래 의 예 와 같 습 니 다.
var name = 'Skylor.min';
function echo() {
alert(name);
}
function env() {
var name = 'mm';
echo();
}
env();
그의 운행 결 과 는 Skylor.min 이다.위의 지식 을 결합 하여 다음 의 예 를 살 펴 보 겠 습 니 다.자바 스 크 립 트 권위 지침 의 고전 을 기억 합 니 다.자바 스 크 립 트 의 함 수 는 그들 이 실행 하 는 역할 영역 이 아니 라 정 의 된 역할 영역 에서 실 행 됩 니 다.
function factory() {
var name = 'Skylor.min';
var intro = function(){
alert('I am ' + name);
}
return intro;
}
function app(para){
var name = para;
var func = factory();
func();
}
app('mm');
app 을 호출 할 때 scope chain 은{window 활동 대상(전역)}->{app 의 활동 대상}으로 구성 되 어 있 습 니 다.app 함수 체 에 처음 들 어 갔 을 때 app 의 활동 대상 은 arguments 속성 이 있 고 다른 두 개의 값 은 undefined 속성 입 니 다.name 과 func.그리고 하나의 값 은'mm'의 속성 para 입 니 다.
이때 scope chain 은 다음 과 같 습 니 다.
[[scope chain]] = [
{
para : 'mm',
name : undefined,
func : undefined,
arguments : []
}, {
window call object
}
]
factory 에 들 어 가 는 함수 체 를 호출 할 때 factory 의 scope chain 은 다음 과 같 습 니 다.
[[scope chain]] = [
{
name : undefined,
intor : undefined
}, {
window call object
}
]
이 때 역할 도 메 인 체인 에는 app 의 활동 대상 이 포함 되 어 있 지 않 습 니 다.intro 함 수 를 정의 할 때 intro 함수 의[scope]는:
[[scope chain]] = [
{
name : 'Skylor.min',
intor : undefined
}, {
window call object
}
]
factory 함수 에서 돌아 온 후 app 에서 intor 를 호출 할 때 식별 자 해석 이 발생 했 습 니 다.이때 sope chain 은:
[[scope chain]] = [
{
intro call object
}, {
name : 'Skylor.min',
intor : undefined
}, {
window call object
}
]
scope chain 에는 factory 활동 대상 이 포함 되 어 있 지 않 기 때문에 name 식별 자 분석 결 과 는 factory 활동 대상 의 name 속성,즉'Skylor.min'이 어야 합 니 다.그래서 운행 결 과 는:I am Skylor.min
이로써 완전한 실행 프로 세 스 는"JavaScript 의 함 수 는 실행 되 는 역할 영역 이 아니 라 정 의 된 역할 영역 에서 실 행 됩 니 다."라 는 것 을 명확 하 게 읽 을 수 있 습 니 다.이 말 이 뭔 데?
위의 몇 가지 문 제 를 설명 하기 위해 서 는 자바 스 크 립 트 의 사전 컴 파일 도 말 해 야 한다.
JavaScript 의 사전 컴 파일
사전 컴 파일,C 등 을 배 운 우 리 는 모두 알 고 있 습 니 다.그러나 문제 가 생 겼 습 니 다.자 바스 크 립 트 는 스 크 립 트 언어 이 고 자 바스 크 립 트 의 실행 과정 은 번역 이 실행 되 는 과정 입 니 다.자 바스 크 립 트 의 실행 과정 에서 비슷 한 컴 파일 과정 이 있 습 니까?
만약 확실 하지 않다 면,먼저 하나의 예 를 통 해:
alert(typeof fun); //function
function fun() {
alert('I am Skylor.min');
};
이때 튀 어 나 온 것 은?내 가 간다.'I am Skylor.min'인 데 왜 그 럴 까?왜 undefined 가 아니 었 을 까?
네,맞습니다.JS 에 서 는 사전 컴 파일 과정 이 있 습 니 다.JS 는 모든 JS 코드 를 실행 하기 전에 var 키워드 와 function 정의 식(함수 정의 식 과 함수 표현 식)을 먼저 처리 합 니 다.
앞에서 말 한 바 와 같이 호출 함수 가 실행 되 기 전에 먼저 활동 대상 을 만 든 다음 에 이 함수 의 국부 변수 정의 와 함수 정 의 를 찾 습 니 다.변수 이름과 함수 이름 을 모두 이 활동 대상 의 동명 속성 으로 합 니 다.국부 변수 에 대한 정 의 는 변수의 값 이 진정 으로 실 행 될 때 만 계산 합 니 다.이 때 는 간단하게 undefined 로 부 여 됩 니 다.
그리고 함수 에 대한 정 의 는 주의해 야 할 부분 입 니 다.
alert(typeof fun); // :function
alert(typeof fn); // :undefined
function fun() { //
alert('I am Skylor.min');
};
var fn = function() { //
}
alert(typeof fn); // :function
이것 이 바로 함수 정의 식 과 함수 표현 식 의 차이 입 니 다.함수 정의 식 에 대해 서 는 함수 정 의 를 앞 당 깁 니 다.함수 표현 식 은 실행 과정 에서 계산 합 니 다.여기까지 말 하 는 김 에 한 가지 질문 을 하 겠 습 니 다.
var name = 'Skylor.min';
age = 25;
우 리 는 var 키 워드 를 사용 하지 않 고 정의 하 는 변 수 를 알 고 있 습 니 다.이 는 전체 변수 에 해당 하고 우리 가 방금 알 고 있 는 지식 과 연 결 됩 니 다.
age 를 식별 자 로 해석 할 때 쓰기 동작 이기 때문에 전체 window 활동 대상 을 찾 았 을 때 이 식별 자 를 찾 지 못 했 을 때 window 활동 대상 을 바탕 으로 undefined 의 age 속성 을 되 돌려 줍 니 다.
즉,age 는 최고급 역할 영역 에서 정 의 됩 니 다.
지금,아마도 당신 은 내 가 방금 말 한 것 을 알 고 있 을 것 입 니 다.JS 는 모든 JS 코드 를 실행 하기 전에 var 키워드 와 function 정의 식(함수 정의 식 과 함수 표현 식)을 먼저 처리 합 니 다.
네,다음 의 예 를 보 여 주세요.
<script >
alert(typeof mm); // :undefined
</script >
<script >
function mm() {
alert('I am Skylor.min');
}
</script >
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.