美文网首页
js中函数的参数传递方式

js中函数的参数传递方式

作者: 沧澈 | 来源:发表于2019-01-07 10:00 被阅读0次

    ECMAScript中所有函数的参数都是按值传递的。
    也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

    • 向参数传递基本类型值
      传递一个基本类型值时,被传递的值会被复给一个局部变量(arguments中的一个元素)
    function add(num) {
        num += 10;
        return num;
    }
    
    var count = 20;
    var res = add(count);
    console.log(count); //20
    console.log(res); //30
    

    变量count作为参数传递给函数,在函数内部,参数num被加10,但是这一变化不会影响函数外部的count变量。

    • 向参数传递引用类型值
      传递一个引用类型值时,会把这个值在堆内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
    function setName(obj) {
        obj.name = 'hello';
    }
    
    var person = new Object();
    setName(person);
    console.log(person.name);  //  hello
    

    以上代码创建了一个对象,并将其保存在了变量person中,这个对象被传递到了setName函数中被复制给了obj。在函数内部,obj和person引用的是同一个对象,于是在函数内部为obj添加一个name属性后,外部的person也会有所反应,因为person 指向的对象在内存中只有一个,而且是全局对象。

    但是函数的参数并不是按引用传递的,而是按值传递的。
    function setName(obj) {
        obj.name = "hello";
        obj = new Object();
        obj.name = 'world';
    
    }
    
    var person = new Object();
    setName(person);
    console.log(person.name);  // hello
    

    以上代码中,在把person传递给setName函数后,其name属性被设置为‘hello’。然后,又将一个新的对象赋值给obj,同时将其name设置为‘world’的新对象。但是,接下来再访问person.name时,显示的仍然是‘hello‘,这说明即使在函数内部修改了参数的值,但是原始的引用仍然不变。
    实际上,当在函数内部重写obj时,这个变量的引用就是一个局部变量了,而这个局部变量会在函数执行完毕后立即被销毁。

    参考:《javaScript高级程序设计》

    相关文章

      网友评论

          本文标题:js中函数的参数传递方式

          本文链接:https://www.haomeiwen.com/subject/lmyyrqtx.html