이 기사에서 제공하는 내용은 js의 블록 수준 범위와 함수 범위의 차이점에 관한 것입니다. (코드 분석)에는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.
ES5에는 함수 범위가 아닌 전역 범위만 있고 블록 수준 범위가 없으므로 불합리한 시나리오가 많이 발생합니다.
첫 번째 시나리오에서는 내부 변수가 외부 변수를 덮어쓸 수 있습니다.
var tmp = new Date(); function f(){ console.log(tmp); if(false){ var tmp = "hello"; } } f(); // undefined
위 코드에서 f
함수가 실행된 후 출력 결과는 정의되지 않음
입니다. 변수 승격으로 인해 내부 tmp
변수가 외부 tmp
변수를 덮어쓰게 되기 때문입니다. f
执行后,输出结果为undefined
,原因在于变量提升,导致内层的tmp
变量覆盖了外层的tmp
变量。
第二种场景,用来技术的循环变量泄露为全局变量:
var s = "hello"; for(var i=0;i<s.length;i++){ console.log(s[i]); } console.log(i); // 5
上面代码中,变量i
只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
let
实际上为JavaScript新增了块级作用域
function f1(){ let n = 5; if(true){ let n = 10; } console.log(n); // 5 }
上面的函数有2个代码块,都声明了变量n
,运行后输出5。这表示外层代码块不受内层代码块的影响。如果使用var
定义变量n
{ {let insane = "hello"} console.log(insance); // 报错 }
i
는 루프를 제어하는 데에만 사용되지만 사라지지는 않습니다. 루프가 끝난 후 전역 변수로 유출됩니다. ES6의 블록 수준 범위let
는 실제로 JavaScript에 새로운 블록 수준 범위를 추가합니다{ let a = "hello"; {let a = "hello"} }
n< /code를 선언합니다. >, 실행 후 5를 출력합니다. 이는 외부 코드 블록이 내부 코드 블록의 영향을 받지 않음을 의미합니다. <code>var
를 사용하여 변수 n
을 정의하는 경우 최종 출력 값은 10입니다. 외부 스코프는 내부 스코프의 변수를 읽을 수 없습니다: // IIFE写法 (function(){ var tmp = ...; ... }()); // 块级作用域写法 { let tmp = ...; ... }
function f(){ ... swap(var_a,var_b); (function swap(a,b){ var tmp; tmp = a; a = b; b=tmp; })(var_a,var_b); }
function f(){ let a,b; ... { let tmp; tmp = a; a = b; b=tmp; } }
간단히 말해서 익명 함수를 즉시 실행하는 목적은 블록 수준 범위를 설정하는 것입니다. 이제 실제 블록 수준 범위가 있으므로 익명 함수를 즉시 실행할 필요가 없습니다. 관련 권장 사항:
🎜🎜js의 범위 및 함수 폐쇄 예시 설명🎜🎜🎜🎜🎜PHP{} 블록 수준 범위 세부 설명🎜🎜위 내용은 js에서 블록 수준 범위와 함수 범위의 차이점은 무엇입니까? (코드 분석)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!