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

  • Post author:
  • Post category:其他


当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



版权声明:本文为qq_31214097原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。