对于 JavaScript 引擎, 无论作用域中的声明出现在什么地方, 都将在代码本身被执行前首先进行处理. 即所有声明 (变量和函数) 都会被 "移动" 到各自作用域的最顶端, 该过程称为 "提升".
JavaScript 中, 变量可以在使用后声明, 也就是变量可以先使用再声明.
下面两个实例有相同的结果:
1, 变量提升前的代码
- <!DOCTYPE html>
- <HTML>
- <head>
- <meta charset="utf-8">
- <title>
- HTML 中文网
- </title>
- </head>
- <body>
- <p id="demo">
- </p>
- <script>
- x = 5; // 变量 x 设置为 5
- elem = document.getElementById("demo"); // 查找元素
- elem.innerHTML = x; // 在元素中显示 x
- var x; // 声明 x
- </script>
- </body>
- </HTML
2, 变量提升后运行的代码
- <!DOCTYPE HTML>
- <HTML>
- <head>
- <meta charset="utf-8">
- <title>
- HTML 中文网
- </title>
- </head>
- <body>
- <p id="demo">
- </p>
- <script>
- var x; // 声明 x
- x = 5; // 变量 x 设置为 5
- elem = document.getElementById("demo"); // 查找元素
- elem.innerHTML = x;
- </script>
- </body>
- </HTML>
变量提升: 函数声明和变量声明总是会被解释器悄悄地被 "提升" 到方法体的最顶部.
函数内的变量提升:
与全局作用域一样, 函数作用域内部也会产生 "变量提升" 现象. var 命令声明的变量, 不管在什么位置, 变量声明都会被提升到函数体的头部.
- function foo(x) {
- if (x> 100) {
- var tmp = x - 100;
- }
- }
- // 等同于
- function foo(x) {
- var tmp;
- if (x> 100) {
- tmp = x - 100;
- };
- }
来源: http://www.css88.com/qa/javascript/11597.html