首頁  >  問答  >  主體

javascript - 如何在一個函數內部修改一個外部變數

如題,程式碼如下:

var test = 0;
function fn(){
    //...
    fn2(test);//调用另一个方法,传入全局变量test
}
function fn2(t){
    t++;//修改传入的变量,但是全局变量并没有受影响,这里的t不是一个指向全局test的路径吗?
    }

求解惑

给我你的怀抱给我你的怀抱2694 天前1033

全部回覆(7)我來回復

  • 欧阳克

    欧阳克2017-06-28 09:28:51

    你上面的寫法,只是把test的值當成參數,傳進去了fn2裡面而已,fn2裡面的參數t僅僅只是和test值相同。
    如果想在函數內部,修改外部變量,可以這樣寫。

    var test=3
    function fn2(){
        test++;
    }
    fn2();
    console.log(test)
    //也可以这样写
    var test=3
    function fn2(t){
        return ++t;
    }
    test=fn2(test);
    test=fn2(10);
    

    回覆
    0
  • PHP中文网

    PHP中文网2017-06-28 09:28:51

    題主已經解答了「如何修改外部變數」呀...

    let test = 0;
    function fn(){
        test++;
     }
     fn(); // test == 1 这样就行了

    參數t當然不是指向test了,因為test是原始類型,原始類型是值傳遞的方式,就是說只是把值copy一份傳遞給了對方變數;而引用類型是引用(共享)傳遞,引用類型的值是指向的對象的​​指針,傳遞時是把這個指針copy一份傳遞給對方變量,修改對方變量就是在修改原始變量,因為他們指向同一個內存地址,同一個對象。

    let foo = { counter: 0};
    function fn(){
        fn2(foo);
    }
    function fn2(t){
        t.counter++;
    }
    fn();// foo.counter == 1;//这样就达到题主要的效果了

    引用(共享)傳遞也可以說是值傳遞的一種,只是傳遞的值比較特殊,是個指標。

    回覆
    0
  • 阿神

    阿神2017-06-28 09:28:51

    javascript的函數都是傳值而不是傳引用,t跟test除了值相同之外沒有任何關係。

    回覆
    0
  • 扔个三星炸死你

    扔个三星炸死你2017-06-28 09:28:51

    直接改變就可以了,不用傳值進來

    回覆
    0
  • 滿天的星座

    滿天的星座2017-06-28 09:28:51

    多了解了解js的值傳遞跟引用傳遞。
    如果你一定要這樣寫,可以把test變數封裝到一個Object中去,然後把物件傳給這個函數進行修改。

        var obj = {
            test:0
        }
        function fn(){
            fn2(obj);
        }
        function fn2(obj){
            obj.test++;
        }
        fn();

    回覆
    0
  • 巴扎黑

    巴扎黑2017-06-28 09:28:51

    雷雷

    回覆
    0
  • 習慣沉默

    習慣沉默2017-06-28 09:28:51

    JavaScript的基本型別沒有指針,也沒有引用;Object另外說, 所以只能這樣 trick 一下。

    var global = {
      test1: 1,
      test2: 2
    }
    
    function fn () {
      changeByPointer('test1')
    }
    
    function fn2() {
      changeByPointer('test2')
    }
    
    function changeByPointer (pointer) {
      // do something
      global[pointer] ++
    }

    回覆
    0
  • 取消回覆