다음 절차의 결과는 무엇입니까?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> <script type="text/javascript"> var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); </script> </head> <body> </body> </html>
결과 팝업: 10
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> <script type="text/javascript"> var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); </script> </head> <body> </body> </html>
결과 팝업: 1
충격이죠? 무슨 일이에요? 이는 낯설고, 위험하고, 혼란스러울 수 있지만 실제로는 매우 유용하고 인상적인 JavaScript 언어 기능인 변수 호이스팅이기도 합니다.
JavaScript 초기화는 승격되지 않습니다.
JavaScript 선언된 변수만 승격되고, 초기화된 변수는 승격되지 않습니다.
1.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p id="demo"></p> <script> var x = 5; // 初始化 x var y = 7; // 初始化 y elem = document.getElementById("demo"); // 查找元素 elem.innerHTML = x + " " + y; // 显示 x 和 y </script> </body> </html>
2.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p id="demo"></p> <script> var x = 5; // 初始化 x elem = document.getElementById("demo"); // 查找元素 elem.innerHTML = "x 为:" + x + ",y 为:" + y; // 显示 x 和 y var y = 7; // 初始化 y </script> </body> </html>
2의 y는 정의되지 않은 결과를 출력하지만 변수 선언(var y)은 승격되지만 초기화(y = 7)는 승격되지 않기 때문입니다. y 변수는 정의되지 않은 변수입니다.
헤드에서 변수를 선언하세요.
JavaScript 변수 호이스팅은 대부분의 프로그래머에게 알려져 있지 않습니다.
프로그래머가 변수 승격을 잘 이해하지 못하면 그들이 작성하는 프로그램에 문제가 발생하기 쉽습니다.
이러한 문제를 방지하기 위해 일반적으로 각 범위가 시작되기 전에 이러한 변수를 선언합니다. 이는 일반적인 JavaScript 구문 분석 단계이므로 이해하기 쉽습니다.