首页 新闻 会员 周边

求教,怎么理解 Js函数的参数都是按值传递?

0
悬赏园豆:80 [待解决问题]

Js高级程序设计里,说函数参数只能按值传递,我研究了好久,网上的解释也恍恍惚惚。不懂的是,作者为什么要把形参obj重写,然后得出结论:obj的属性的改变没有引起外部person属性的改变,所以这不是一个按引用传递。我的天!都重写了,obj在内存都已经换指向了,跟person毛关系都没有了,当然引不起person的属性改变了!这证明不了按值传递啊!难道我理解有问题吗?求大神解答!感激不尽!为此头疼一天了。 

书上的代码:

function setName(obj){

    obj.name="N";

    obj=new Object();

    obj.name="G";

}

var person=new Object();

setName(person);

alert(person.name);//"N"

形而上的小鱼的主页 形而上的小鱼 | 初学一级 | 园豆:24
提问于:2016-11-25 21:21
< >
分享
所有回答(2)
0

那一节你没看全吧,按值传递指的是,基本类型的值指的是本省,而引用类型的值指的是内存中的地址,最明显的特征既是,形参和实参是独立的,分别举个例子:

1.值类型

function func(i)
{
    console.log(i);//3
    i = 2;  
}

var j = 3;
func(j);
console.log(j);//3

func中对传入的变量j的修改并没有影响到外部

2.引用类型

就来你举的这个例子来说好了,你将一个person对象传到obj,它们便指向了相同的对象(内存中地址相同),你在方法里面对obj重新赋值(改变了内存中地址),并没有改变外部的person对象(还是原来的地址),这里我再拿C#来做个对比:

class Person
        {
            public string Name { get; set; }
        }

        static void Main(string[] args)
        {
            var person = new Person();
            SetName(ref person);
            Console.WriteLine(person.Name);//taffy
            Console.ReadKey();
        }

        static void SetName(ref Person person)
        {
            person.Name = "jello";
            person = new Person();
            person.Name = "taffy";
        }

这里通过ref来传递person引用,我在方法中对person重新赋值,也修改了外部的实参(有那么点C/C++中二重指针的味道)

jello chen | 园豆:7336 (大侠五级) | 2016-11-25 23:40
0

C++ 值传递、指针传递、引用传递详解 语言都是相通的,可以看看这个。

创心coder | 园豆:736 (小虾三级) | 2017-01-13 12:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册