作用域
1、全局作用域
在任何地方都可以访问到的是全局作用域。
2、局部作用域
只在固定的代码片段内可访问到的变量,例如函数内部。
3、块级作用域(ES6新增)
在一对花括号{}中的包裹的代码。
预解析
- JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。
- JavaScript解析器执行JavaScript代码的时候,分为预解析和代码执行。
预解析过程
1、var变量预解析:把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值。
//代码示例
<script>
console.log(num); // undefined
var num = 123;
</script>
//预解析过程
<script>
// 把变量的声明提升到当前作用域的最前面
var num;
console.log(num);
num = 123;
</script>
2、函数预解析:把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用。
//代码示例
<script>
test();
alert(test);
function test() {
console.log("hello world");
}
</script>
//预解析过程
<script>
// 把函数的声明提升到当前作用域的最前面
function test() {
console.log("hello world");
}
test();
alert(test);
</script>
3、先提升var,再提升function。
//代码示例
<script>
var a = 666;
test();
function test() {
var b = 777;
console.log(a);
console.log(b);
var a = 888;
}
</script>
//预解析过程
<script>
var a;
function test() {
var b;
var a;
b=777
console.log(a); //undefined
console.log(b);//777
a = 888;
}
a = 666;
test();
</script>
注意点
变量和函数同名时, 函数提升的优先级高于变量。
<script>
console.log(num);
function num() {
console.log("hello world");
}
var num = 666;
console.log(num);
/*预解析
function num() {
console.log("hello world");
}
var num;
console.log(num);
/*ƒ num() {
console.log("hello world");
}*/
num = 666;
console.log(num);//666
*/
</script>