zoukankan      html  css  js  c++  java
  • 带你深入理解传递參数

    传递參数

    ECMAScript中全部函数的參数都是按值传递的。

    也就是说,把函数外部的值复制给函数内部的參数,就和把值从一个变量拷贝到还有一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递。则如同引用类型变量的复制一样。

    有不少开发者在这一点上可能会感到困惑,由于訪问变量有按值和按引用两种方式,而參数仅仅能按值传递。

    在向參数传递基本类型的值时。被传递的值会被复制给一个局部变量(即命名參数。或者用ECMAScript的概念来说。就是arguments对象中的一个元素)。在向參数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。

    请看以下这个样例:

    function addTen(num) {
        num += 10;
        return num;
    }
    var count = 20;    
    var result = addTen(count);
    alert(count);    //20。没有变化
    alert(result);  //30

    这里的函数addTen()有一个參数num,而參数实际上是函数的局部变量。在调用这个函数时,变量count作为參数被传递给函数。这个变量的值是20。于是。数值20被复制给參数num以便在addTen()中使用。

    在函数内部,參数num的值被加上了10,但这一变化不会影响函数外部的count变量。參数num与变量count互不相识。它们仅仅是具有同样的值。

    假如num是按引用传递的话,那么变量count的值也将变成30,从而反映函数内部的改动。当然。使用数值等基本类型值来说明按值传递參数比較简单,但假设使用对象。那问题就不怎么好理解了。再举一个样例:

    function setName(obj) {
    obj.name = "Nicholas";    
     }
    var person = new Object();
    setName(person);
    alert(person.name);    //"Nicholas"    
    

    以上代码中创建一个对象,并将其保存在了变量person中。然后。这个变量被传递到setName()函数中之后就被复制给了obj。

    在这个函数内部。obj和person引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj也会按引用来訪问同一个对象。于是,当在函数内部为obj加入name属性后。函数外部的person也将有所反映。由于person指向的对象在堆内存中仅仅有一个。并且是全局对象。有非常多开发者错误地觉得:在局部作用域中改动的对象会在全局作用域中反映出来,就说明參数是按引用传递的。

  • 相关阅读:
    如何学习WindDbg
    如何在程序中嵌入google的V8 Javascript引擎
    理解程序内存
    如何学习Windows编程
    如何让窗口控件半透明
    Sessions, Window Stations and Desktops
    QQ截图时窗口自动识别的原理
    为什么设计模式在C++社区没有Java社区流行?
    当年写的俄罗斯方块
    如何判断一个C++对象是否在堆上
  • 原文地址:https://www.cnblogs.com/llguanli/p/8391310.html
Copyright © 2011-2022 走看看