Web前端面试笔试题2——JS(1):函数调用(局部变量/全局变量)

来源:互联网 发布:淘宝面膜排行榜 编辑:程序博客网 时间:2024/06/04 19:46

1、函数调用——局部变量/全局变量

案例1-1:fun(a)函数有传参,即可更改“局部变量”

var a=100;function fun(a){     a++;     console.log(a);}fun(100);//101;console.log(a);//100

解析:在上述案例中,由于函数fun()中传入参数“a”,所以a=100,进行了函数赋值,“a++”之后,a由“100”变成了“101”;再经过“fun(a)”,输出“101”,fun(100)返回“101”。


但是,对于fun(a)而言,“a++”后“a=101”,作为一个局部变量,在程序执行完毕就被销毁,所以在外部函数而言,“a= ”全局变量“a(100)”,所以“console.log(a)”,输出“100”。

window
a100fun(函数对象)console.log(a)



拓展——
如果将函数fun(a)改为“fun()”,表示函数没有局部变量,即设置了“无参”模式,自身没有传递“局部变量”,所以经过“a++”之后,更改完即更改全局变量。


案例1-2:fun()没有传递参数,即为“全局变量”
var a=100;function fun(){    a++;    console.log(a);}fun(100);    //101console.log(a);    //101

解析:
在上述案例中,唯一不同的就是“fun(a)”改为“fun()”,即“fun()”不传入参数,里边的参数即为传递“全局变量”,所以“a++”之后,更改的是“全局变量a”;
但是,案例1-1中“fun(a)”中,即“fun(a)”传入参数,里边的参数即为传递“局部变量”,当函数fun()执行完毕后,局部变量即刻销毁,所以“console.log(a)”还是“全局变量”,这亦是两个案例的不同之处所在。


2、给未声明的变量赋值,系统会自动定义声明
案例2-1:
var n=101;function foo(){    m=100;    console.log(m);}foo();              //100console.log(m);     //100
解析:
在上述案例中,由于“fun()”表示“无主语”状态,即表示全局变量,所说外部仅有全局变量“n”,但是在fun()函数中,“m=100”,变量声明,所说外部仅定义全局变量“n”,并未定义“m”。但是,系统会自动定义“m”,此时“m”为“全局变量”。


案例2-2:
function foo(m){    m=100;    console.log(m);}foo();              //100console.log(m);     //会报错!
解析:
在上述案例中,与“案例2-1”不同的是。foo(m)传入了参数“m”,此时“m”不再是“foo()”中的为“全局变量”,此时是“局部变量”。
根据局部变量特点“执行完毕即被销毁”,所以,执行完“foo()”函数后,局部变量“m”即刻消失,所以“console.log(m)”即会报错!

总结——
(1)若函数传递参数,如“fun(a)”,此时函数内部“a”,即为局部变量,外部为“全局变量”。
(2)局部变量“a”仅在局部函数“fun(a)”调用执行时被使用,执行完毕后,局部变量“a”将被销毁。
(3)若在函数fun()未传递参数,即为“全局变量”。若声明了未被定义的变量,此时的变量系统会自动定义该变量,为“全局变量”。
(4)若在函数fun()中传递参数fun(m),此时只执行函数内部,执行完毕即销毁,“console.log(m)”将会报错显示。


3、局部变量+全局变量“混合”
案例3-1:
var a=100;function fun(){    console.log(a);    var a=90;    console.log(a);}fun();//undefined  90console.log(a);         //100

解析:
由于在局部变量中,并未定义变量“a”,所以此时a为“未定义undefined”状态;
后来又重新赋值“90”,此时函数输出“90”,“a=90”作为“局部变量”,执行完毕即被销毁。
但是,外部全局变量并不会改变,还是“a=100”。

案例3-2:
var a=100;function fun(){    console.log(a);    a=90;    console.log(a);}fun();//100  90console.log(a);         //90

解析:
由于与“案例3-1”相比,“var a=90”取消了“var”,此时“无var,有赋值”,“a”为全局变量二次赋值,此时“a=90”。
但是,起始的“a=100”由于重新赋值,所以“a=90”


4、函数重复声明、调用
function foo(){   return 1;}console.log(foo());       //1function foo(){   trturn 2;}console.log(foo());      //2var foo=100;console.log(foo());      //“出错”

解析:
由于上述案例中,前两个均为“声明提前”,但是第三个中,声明“var  foo=100”,此时的foo为一个变量,而不是一个函数类型,所以当“console.log(foo())”时,会出错。

0 0