变量的作用域
变量的作用域:变量使用的范围,一般包括全局,局部和块级作用域。根据定义的位置来判断作用域类型
1、局部变量
局部变量就是定义在函数内部的变量,这个变量只能在函数内部使用,即作用域范围只是函数内部,对于该函数里面的函数而言,该函数的变量也是他的“小全局变量”,在外部调用改变量就会出错,undenfined;函数的形参也是局部变量,只能在当前函数被使用。
function fn01(){
fn02();
console.log(a);a为fn02的局部变量,所以为undenfined
}
function fn02(){
var a = 100;局部变量,
console.log(a);
2、全局变量
全局变量就是定义在函数外部的变量,这个变量在任何函数中都有效,即作用域范围是当前文件的任何地方。不但在任何函数中都可以使用,而且值是公共的。即A函数改变值后,B函数拿到的就是改后的值。全局变量外面没函数可以理解为window的属性,函数为window的方法
var global_num = 25;
function fn01(){
global_num = 10;
console.log("global_num);//10
fn02();
}
function fn2(){
console.log(global_num);10
}
在函数内部使用的是局部变量,这叫就近原则
var age = 250; function fn(){ var age = 100; console.log("fn里:age",age);100,就近原则。 }
全局变量的是使用场景
当在若干个函数里使用同名变量g,并且,A函数中改了g的值,B函数中要使用改后的值,使用全局变量。如果,A函数中改了g的值,如果其它函数中并不使用A函数更改后的值,不需要定义成全局变量。
变量的声明提升
在预编译阶段,声明的变量,总是会被提升,提升到变量的作用域的顶端(如:函数体的顶端)。
1、声明的变量会被提升作用域范围的顶端。
function fn(){
console.log(a);
var a ;
}
预编译阶段:会把以上代码中 var a ,提升到函数体的第一行。即:在编译之前,以上代码,会被处理成:
function fn(){
var a;
console.log(a);
}
2、提升的只是声明,不提升赋值。
function fn(){
console.log(a);
var a = 100;定义(声明)变量,并且赋值;
}
预编译后,以上代码被改为:
function fn(){
var a;
console.log(a);
a = 100;定义(声明)变量,并且赋值;
}
变量赋值并没有被提升,只是声明被提升了。所以有些看着逻辑正常的代码在预编译阶段声明提升后就会呈现undenfined的情况
3)、当全局变量和局部变量重名并且碰到了声明提升
var age = 250;
function fn(){
console.log(age);250,undefined。
var age = 100;
console.log(age);100
}
如果按原本代码分析有可能就会忘记声明提升,在不调试的情况下判断为250
以上代码经过预编译后,成为以下代码:
var age = 250;
function fn(){
var age;
console.log(age);undefined;
age = 100;
console.log(age);100
}