首先介绍一下隐式全局变量,隐式全局变量就是在函数中,只有赋值,但是没有进行关键字的声明,隐式全局变量在函数内外都可以访问到,除非将其进行删除。 当形参和隐式全局变量相同的时候,隐式全局变量的作用域就限制在函数中,具体情况分为基本数据类型和引用数据类型两种情况:
var num2=66;
function f1(num1,num){
//省略了var num1,var num,这两个为局部变量,函数执行完就释放内存
num=100;
num1=100;
num2=100; // num2为全局变量,值从66-》100
console.log(num); //100
console.log(num1); //100
console.log(num2); //100
}
f1(num1,num2); // 100 100 100
console.log(num1); //55
console.log(num2); //100
console.log(num); //报错
当形参为引用数据类型时:
var foo = {n : 1};
(function(foo) {
console.log(foo.n); //1
foo.n = 3; //全局中foo中n的值改为3
var foo = {n : 2}; //重新创建一个局部变量foo
console.log(foo.n); //2
})(foo);
console.log(foo.n); // 3
//等同于
var foo = {n : 1};
function fun(foo) {
console.log(foo.n); //1
foo.n = 3; //全局中foo中n的值改为3
var foo = {n : 2}; //重新创建一个局部变量foo
console.log(foo.n); //2
};
fun(foo)
console.log(foo.n); //3
//当foo为基本数据类型时:
var foo = 1;
function fun(foo) {
var foo;
console.log(foo); //1
foo = 3;
foo = 2;
console.log(foo); //2
};
fun(foo);
console.log(foo); //1