JS中全局变量作为函数实参传入的问题

当js中的全局变量作为形参传入时,默认都是值拷贝传入进去的,无论是对象传进去或者值传进去。例如,值传进去有如下代码。

var a = 1;
function temp(b){
b = a;
b += 1;
console.log(b);
}
console.log(a);
(temp(a));
console.log(a);

这样在函数中改变局部变量的值,不会改变全局变量的属性,但是若将对象拷贝进去,即使在函数内部重新赋予一个新的值b随后等于传进来的实参 也会修改全局变量的值。

var a = new Date();
var getSevenDays = function(weekMonday) {
let date = weekMonday; //每周的第一天
date.setDate(date.getDate() + 1);
console.log(date);
}
console.log(a);
console.log(getSevenDays(a));
console.log(a);

发现不仅在内部修改了形参,也会修改外部的全局变量的值。

ar a=[1,2,3],
var b=1;
function foo(a,b){
    a=[4,5,6];
    b=2;
}
foo(a,b);
console.log(a); // [1,2,3]
console.log(b); //1;

然而这种情况下,对形参值重新进行赋值,发现内部形参的值是不会改变全局变量的。

想来也是比较纳闷。

总结来讲:对引用数据类型,会发现在函数里,形参被赋值之前,对形参调用引用数据类型的属性(或方法)时,不仅会改变形参,还会改变全局变量。这大概是同名形参和全局变量的一种对应吧,通俗解释一下就是只有当你在函数里被重新赋值之后,你才是独立的。而在这之前我们是穿一条裤子的,属性和方法的调用会同时改变我们。 
希望对你有帮助。

因此,个人的方法便是,若传到函数内部的是一个引用对象,又不希望改变全局变量的值,就要重新赋予空间并且赋值,例如对于数组,就对形参的值全部取出来随后一个个push进去,而对于date对象,将其毫秒数拿出后重新创建新的date对象,这样并不会对原来的全局对象产生影响。

参考博客:https://blog.csdn.net/love2016hy/article/details/77619491

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值