>  기사  >  웹 프론트엔드  >  자바스크립트 학습 노트 3 범위_기본 지식

자바스크립트 학습 노트 3 범위_기본 지식

WBOY
WBOY원래의
2016-05-16 18:36:51867검색

Javascript에서는 전역 환경 자체가 객체입니다. 브라우저 호스트에서는 이 객체가 window이지만, 임베디드 환경 등 브라우저가 아닌 다른 호스트에서 Javascript를 사용하는 경우에는 다른 객체일 수 있습니다.
또한 여기서 개념을 수정하고 싶습니다. 많은 사람들은 Javascript가 브라우저에서만 사용된다고 생각합니다. 실제로 Javascript는 웹이 아닌 여러 상황에서도 사용할 수 있다고 합니다. 임베디드 기반 응용분야. 물론 이런 전설만 들어봤을 뿐입니다.
주제로 돌아가서 var i=1이라고 쓰면 실제로 창 범위에서 변수를 선언하는 것입니다.
i=1이라고 쓰면 창 속성을 선언합니다.
이 코드를 보세요:


[Ctrl A 모두 선택 참고: 외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]

이것은 코드가 따로 출력됩니다. 결과는 undefine world, Welcome china, hello china입니다.
따로 설명하자면:
위에서 Javascript를 미리 컴파일하면 모든 var 변수가 생성되고 기본값이 생성된다고 했습니다. 값이 정의되지 않았습니다. 예를 들면 다음과 같습니다.
다음과 같은 코드를 작성할 수 있습니다.

[Ctrl A 모두 선택 참고:
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]
우리는 이 섹션을 실행합니다. 스크립팅을 할 때 정의되지 않은 팝업이 먼저 나타난 다음 b가 존재하지 않음을 나타내는 스크립트 오류가 표시되는 것을 볼 수 있습니다. 프리컴파일 과정에서 a가 생성되어 정의되지 않은 상태로 초기화된 것을 볼 수 있지만, b는 실제 런타임 중에만 순차적으로 해석될 수 있습니다. 실제로 미리 컴파일된 자바스크립트 코드는 대략 다음과 같이 이해하면 됩니다.
[Ctrl A 모두 선택 참고:
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]

다음에 이야기하겠습니다. 함수 범위의 문제 코드가 함수로 실행될 때마다 Javascript 엔진은 자동으로 새 범위를 생성한 다음 이 새 범위를 현재 범위의 하위 범위로 사용하고 현재 코드를 전환합니다. 이 새로운 범위에 적용됩니다. 코드가 함수를 종료하면 이 범위가 삭제되고 코드 범위가 상위 범위로 반환됩니다.
자, 준비가 거의 완료되었습니다. 다음으로 첫 번째 질문인 정의되지 않은 세계가 출력되는 이유를 설명하겠습니다. 먼저 코드가 미리 컴파일되어 Test 메서드에 들어가면 새 범위가 열리고 전역 범위가 상위 범위로 사용됩니다. 그런 다음 Test에서 메서드를 미리 컴파일합니다. 위 코드와 마찬가지로 Test 메서드가 미리 컴파일된 후의 메서드 본문은 대략 다음과 같습니다. 코드 복사

코드는 다음과 같습니다.


function Test() {
var a = undefine;
alert(a " " b)
var a = "welcome" ;
b = "china";
alert(a " " b);
}


물론 b는 현재 범위에서 찾을 수 없습니다. 그의 b="world"는 상위 범위, 즉 전역 범위에서 발견됩니다. 그래서 이런 결과가 나왔습니다.
웰컴차이나가 두 번째로 뜨는데 할 말이 없습니다.
세 번째에는 헬로차이나(Hello China)가 뜹니다. var a는 Test 메소드의 지역 변수일 뿐이고, b는 미리 선언되지 않았기 때문에 해당 정의를 찾기 위해 상위 스코프으로 이동한다는 점을 이해할 수 있다.
[Ctrl A 모두 선택 참고: 외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다 ]
首先,我们将方法体内的var a改成a,我们先不看答案,直接来分析,首先,在预编译阶段,方法体内几乎没有任何改变,因此此时a和b一样,都要去他们的父作用域中去寻找,因此第一次出的结果应该是hello world,第二次没什么说的:welcome china,第三次由于a和b在本作用域内都没有事先定义,因此都是再改变父作用域内的值,因此应该输出welcome china.
我们继续:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

和上面的分析一样,应该输出undefined undefined,welcome china,hello world.
继续:

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

应该是undefined world,welcome china,hello china.
经试验,都没问题, 不知道你明白了么?
因此我们可以得出,每个变量在找不到自己的定义时,都会沿着作用链向上寻找,这样就很可能会出现未预知的错误,给排错添加了很多困难。更麻烦的是,还可能会对父作用域上的变量值进行修改,因此我们在声明变量时应该尽量加上var,尽管Javascript并不强迫我们这样做。
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.