1.示例1:
function f(a){
a = a+1;
alert(a)
}
var a =1;
f(a);
alert(a)
依次输出 2,1
解析:函数外的a是全局变量,函数f中的a是参数a,而不是全局定义里的a,JavaScript中作用域是函数级别的,在f中不管怎么改变参数a,都不会影响全局变量a。
函数的形参和全局变量重名;既然参数也是局部变量,那函数内部对于a的操作都指向局部变量a影响不了全局变量a,
2.示例2
function f(a){
a[0]=a[0]+1;
alert(a[0])
}
var a =[1,2];
f(a);
alert(a[0])
依次输出 2,2
示例3:
var f = true;
if (f === true) {
var a = 10;
}:
function fn() {
var b = 20;
c = 30}
fn();
console.log(a);
console.log(b);
console.log(c);
依次输出:10 ,报错 ,30
解析:function内的新声明的变量才是局部变量,而 没有用var声明的变量在哪里都是全局变量。再次提醒切记只有function(){}内新声明的才能是局部变量,while{…}、if{…}、 for(..) 之内的都是全局变量(除非本身包含在function内)。
4.var 和函数的提前声明
function fn(a) {
console.log(a);
var a = 2;
function a() {}
console.log(a);
}
fn(1);
依次输出 function a(){console.log(a)},2
解析:var和function是会提前声明的,但是function是优先于var声明的(如果同时存在的话),所以提前声明后输出的a是个function,然后代码往下执行a进行重新赋值了,故第二次输出是2。
5.
var a = 10;
function test() {
var b = 100;
console.log(a);//打印结果是10
a=100;
}
test();
console.log(a); //打印结果为100
console.log(b);//报错 b is not defind
依次输出:10,100,报错b is undefind
说明: 因为a 是全局变量所以在函数内部可以被访问且被赋值;第一次打印结果为10;
执行函数后a的值变为100 ;
b是局部变量;在函数外部被打印,访问不到b的值 所以报错;
(1).如果局部变量和全局变量的变量名相同的情况;
var a = 10;
function test() {
console.log(a);//打印结果为undefind
var a = 100;
console.log(a);//打印结果为100
}
test();
console.log(a);//打印结果为10
依次输出: undefined,100,10
说明:1.如果局部变量的变量名和全局变量名形同,在函数内部变量值全部指向局部变量;
2.第5行结果为undefind;因为只要局部变量a被声明,a就指向局部变量,但是打印在赋值之前,结果为undefind;
第二次打印结果在赋值之后 为100;要想改变全局变量a 的值,可以用window.a ;
3.第三次打印在函数外边,所以打印全局变量a,值为10;