变量提升
javascript代码执行过程
预编译—>预解析–>执行代码
针对变量提升:在预解析阶段会将所有var声明的变量提升到顶部,只提升变量的声明,不提升变量的值
针对函数提升:针对整个函数体提升到顶部,可以在任何位置调用函数
第一行打印由于在定义变量num1之前,会变量提升,结果是undefined
<script>
console.log(num1);//undefined
var num1 = 10;
console.log(num1);//10
</script>
此段代码会直接报错 num1 is not defined。
<script>
console.log(num1);//error
</script>
<script>
console.log(num1);//undefined
var num1 = 10;
console.log(num1);//10
num1 = 20;
console.log(num1);//20
</script>
在预解析阶段会针对 变量 和 函数 都进行提升
如果 变量名 和 函数名 重复 则依照函数优先执行
所以第一行打印输出的num1是函数体
<script>
console.log(num1);//function num1(){}
var num1 = 10;
function num1(){
console.log(num1);
console.log(num2);
var num2 = 20;
console.log(num2);
}
console.log(num1);//10
</script>
在代码执行阶段 如果 变量名 和 函数名 重复,则依照变量优先执行
在调用函数的时候回报错,因为此时的变量优先,num1是一个变量等于10,10()不是一个函数,所以会报错。
<script>
console.log(num1);//function num1(){}
var num1 = 10;
function num1(){
console.log(num1);
console.log(num2);
var num2 = 20;
console.log(num2);
}
num1();//error
console.log(num1);//10
</script>
变量作用域
全局变量:定义在全局(函数外)的变量
在页面的任何位置都能正常访问
局部变量:定义在函数内的变量
只能在函数内部被访问
num1是全局变量,在函数内部能够被访问到,输出打印num1为10,num2是局部变量,只能在fn()函数内部被访问到,在函数外部不能被访问到,所以最后打印出num2 is not defined。
<script>
var num1 = 10;
function fn(){
console.log(num1);//10
console.log(num2);//undefind
var num2 = 20;
console.log(num2);//20
}
fn();
console.log(num2); //num2 is not defined
</script>