Scope
JS를 요약하는 세 번째 글은 주로 과거와 다음을 연결하는 링크입니다.
나중에 실행 컨텍스트, 클로저 및 기타 관련 주제를 다룰 예정이며, 내용이 너무 많지 않도록 범위 부분을 별도로 요약합니다.
목차
ForewordjavaScript 내부 기술 시리즈 :
이 자세한 설명, 사고 마인드 맵 및 코드의 조합을 가리 킵니다. , 이 글은 이를 이해하고 전화해서 신청하세요. 시리즈 (1)
프로토타입부터 프로토타입 체인까지, JavaScript 내부 기술을 배양하는 이 글은 정말 놓칠 수 없습니다! 시리즈 (2)이 기사
참고: 범위 외에도 최신 엔터프라이즈 수준이 있습니다. 2020 버전 Vue3.0/Js/ES6/TS/React/Node 및 기타 실용적인 비디오 튜토리얼을 무료로 받으시려면 여기를 클릭하세요. 초보자는 입력하지 마세요
1.1 일반적인 설명
사용된 이름 프로그램 코드에서
가 항상 유효한 것은 아니며 가용성을 제한하는 범위는 이름의 범위입니다.
범위는 변수를 찾는 방법을 규정합니다. 즉, 현재 실행 중인 코드의 액세스 권한을 결정합니다.
function func(){ var a = 100; console.log(a); // 100}console.log(a) // a is not defined a变量并不是任何地方都可以被找到的
동적으로 동적 범위가 있습니다:
함수의 범위는 함수가 정의될 때 결정됩니다.
function fn(){ var name = '余光'; console.log(name);}console.log(name); // ?fn(); // ?
Global의 변수: 어디서나 액세스할 수 있는 개체에는 전역 범위가 있습니다.
함수 외부에서 정의된 변수정의 없이 직접 할당된 모든 변수는 자동으로 전역 범위를 갖도록 선언됩니다.var a = 100;console.log('a1-',a);function fn(){ a = 1000; console.log('a2-',a);}console.log('a3-',a);fn();console.log('a4-',a);
2.1 어휘 범위 이해
var value = 1;function foo() { console.log(value);}function bar() { var value = 2; foo();}bar();
bar
함수를 실행하면 함수 내부에 로컬 범위가 형성됩니다. 값 변수를 선언하고 값 2를 할당합니다.
foo
함수를 실행합니다. 함수 범위의 code>값 이 변수는 바깥쪽을 향하게 됩니다어휘 범위의 규칙에 따르면 함수가 정의될 때 foo
의 외부 범위는 전역 범위print 결과는 1
bar
函数,函数内部形成了局部作用域;foo
函数,函数foo的作用域内没有value
这个变量,它会向外查找foo
입니다. 알아냈는지 궁금합니다. var str = '全局变量';function func(){ console.log(str+1); function childFn(){ console.log(str+2); function fn(){ console.log(str+3); }; fn(); }; childFn();}func();// 全局变量1// 全局变量2// 全局变量3
var a = 100;function fn(){ a = 1000; console.log('a1-',a);}console.log('a2-',a);fn();console.log('a3-',a);// a2- 100 // 在当前作用域下查找变量a => 100// a1- 1000 // 函数执行时,全局变量a已经被重新赋值// a3- 1000 // 全局变量a => 1000
로컬 범위는 일반적으로 고정된 코드 조각 내에서만 액세스할 수 있으며 가장 일반적인 코드는 다음 함수 단위에 있습니다.
function fn(){ var name="余光"; function childFn(){ console.log(name); } childFn(); // 余光}console.log(name); // name is not defined
3. 범위 체인
3.1 변수를 찾을 때 어떤 일이 발생하나요?
먼저 현재 컨텍스트의 변수 객체 에서 검색합니다.
찾지 못하면 상위(어휘 수준의 상위) 실행 컨텍스트
의 변수 객체에서 검색합니다. 전역 컨텍스트의 변수 개체는 전역 개체이기도 합니다.undefined
ReferenceError
。3.3 作用域嵌套
既然每一个函数就可以形成一个作用域(词法作用域
|| 块级作用域
),那么当然也会存在多个作用域嵌套的情况,他们遵循这样的查询规则:
在《你不知道的Js》中,希望读者可以将作用域的嵌套和作用域链想象成这样:
四、思考与总结
4.1 总结
4.2 思考
最后,让我们看一个《JavaScript权威指南》中的两段代码:
var scope = "global scope";function checkscope1(){ var scope = "local scope"; function f(){ return scope; } return f(); // 注意}checkscope1();var scope = "global scope";function checkscope2(){ var scope = "local scope"; function f(){ return scope; } return f;}checkscope2()();
两段代码的结果都是"local scope",书中的回答是:JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。
但是它们内部经历的事情是一样的吗?
相关免费学习推荐:javascript视频教程
위 내용은 마인드맵 + 코드 예시를 통해 범위에서 범위 체인까지의 지식 포인트를 한눈에 명확하게 알 수 있습니다!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!