js 的参数~~~以及传参。


js 的参数~~~以及传参。

                                                            大前端小黄毛。

      参数有两种:一种是基本类型的(Undefined,Null,Boolean,Number,String),另一种是引用类型的(Object)这两种参数传递的时候会有不一样。


      基本类型很简单。就是把值复制过去,然后里面怎么变化是里面的事情,和原来有值的那个无关。

代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>Function Arguments Example 1</title>
    <script type="text/javascript">
        function addTen(num) {
            num += 10;
            return num;
        }
        
        var count = 20;
        var result = addTen(count);
        alert(count);    //20
        alert(result);   //10

    </script>
</head>
<body>

</body>
</html>


解释一下:

由于count作为参数传进来了,所以它的值被复制了一份在num里面。然后num怎么变和count无关。count还是那个count。

翻译成人话:

相当于是我在博物馆复印了一幅蒙娜丽莎,一模一样,然后不管是给复制品加相框,改颜色还是撕毁它,都和真货没关系,真货还在博物馆里墙上挂着呐....


     引用类型的有点小复杂,但知道了原理其实也容易。


代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta name="name" content="content" charset = "utf-8";>
    <title>小黄毛的传参。</title>
    <script type="text/javascript">
      function setName(obj) {
            obj.name = "Nicholas";
            obj = new Object();
            obj.name = "Susan";
            console.log("我是函数里面的"+obj.name);
            abc = 10;   
        }
        var person = new Object();
        setName(person);
        console.log(person.name);    //"Nicholas"
        console.log(abc);
        console.log("在外面调用obj试试~"+obj.name);
       
    </script>
</head>
<body>

</body>
</html>

显示如下:



结果如上:

一、在函数setName之外,abc输出10(蓝色的3);obj is not defined(黑色的4)。

二、obj.name输出结果为susan(红色的1),person.name输出结果为Nicholas(黄色的2)。


一的原因:

首先,obj是个局部变量。

解释一下:

1. function setName(obj){ }长这样表示 obj是个参数。//传闻中的形参

2.  function setName(obj){ } 等价于 function setName(obj) {var obj = null; } 

     所以,酱紫就注定了obj是个在函数setName里面的局部变量~~2333~~小样儿~(在小黄毛的认知范围内,)你就永远都是局部变量啦~~


其次,abc是个全局变量

解释一下:

虽然在函数体里,但是,定义的时候前面没有var。所以默认为全局变量。

综上,结果很明确了。

在函数setName外面console.log();,这俩变量的结果就是全局变量abc输出10(蓝色的3);局部变量obj is not defined(黑色的4)。


二的原因:

var person = new Object();

这句话的意思其实是酱紫的.....开辟一个小地址,用 指针 指到对象object上。


所以,所谓的赋值,比如要把person作为参数传到函数setName的参数obj 里.....

就是下图酱紫。


由于指向的是同一个object,所以,不管是obj还是person,修改了属性以后对方的属性都会保持最新的那个。


然后,下面的代码又做了这么一件事:

obj = new Object();


在图上就是酱紫:


在改了这句之后,person指向的一切与obj无关了~新世界来临了~

一切都是新的~~

翻译成人话就是:

person是个美国男人,setName()是个没国籍的女人,她带了一个孩子obj,也没国籍。person和setName结婚了,他大方地说:让obj随我的国籍吧~然后person和obj就都成美国公民了,他们都有权利修改宪法,但是呢,管用的宪法只有一个版本,就是最新版本。

后来呢,obj长大了,经过考虑,他开心得决定加入中国国籍,所以,他指定中国法律的一切和美国男人无关~美国的法律也和他无关了~他只和中国法律有关。


了解了原理,回来看代码:

随着函数的进行,obj做了这么几件事:

1.加了一个属性:obj.name="Nicholas";//改了美国的宪法 object1的属性

2.指向了一个新地址:new Object();//变成 了中国国籍 从指向object1变为指向object2

3.新地址里添加了一个属性 obj.name = "Susan";//改了中国宪法 即object2的属性


所以,obj.name(指向object2)输出结果为susan(红色的1),person.name(指向object1)输出结果为Nicholas(黄色的2)。

以上。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值