2012-01-30 126 views
0

我想運行一個函數來取消兩個數字之間的公因式。取消函數不在我的包裝函數「multiplyFraction」之內,它不會更改multiplyFraction中的變量。Javascript:用外部函數更改內部變量?

function cancelFac(num1,num2){ 
    var minVal = Math.min(num1,num2); 
    for(var i=2; i<=minVal; i++){ 
     while(num1%i==0 && num2%i==0){ 
      num1 = num1/i; 
      num2 = num2/i; 
     } 
    } 
} 


var multiplyFraction = function(){  
    var a = notZero(rand(13,0)); 
    var b = notZero(rand(13,0)); 

    //Cancel Common factors 
    cancelFac(a,b); 
} 

a和b的值保持不變。當我把for循環直接放在multiplyFraction裏面時,效果很好,但是我想取消它自己的函數,因爲我需要經常這樣做。有任何想法嗎?

回答

1

a和b的值將保持不變,因爲它們是基元類型,而基元類型是通過值而非引用傳遞的。如果你想保持對傳遞給vlaues的改變,那麼通過引用傳遞這些值,即傳遞對象而不是原始類型。或從cancelFac方法返回一個對象。嘗試這個。

function cancelFac(num1,num2){ 
    var minVal = Math.min(num1,num2); 
    for(var i=2; i<=minVal; i++){ 
     while(num1%i==0 && num2%i==0){ 
      num1 = num1/i; 
      num2 = num2/i; 
     } 
    } 

return { num1: num1, num2: num2 }; 
} 

var multiplyFraction = function(){  
    var obj = { 
    a: notZero(rand(13,0)), 
    b: notZero(rand(13,0)) 
    }; 

    //Cancel Common factors 
    obj = cancelFac(obj.a, obj.b); 
} 
+0

對不起,花了一年多的時間才接受這個,我只是看着我的老問題,注意到我還沒有那樣做 – mv3 2013-08-21 14:34:51

0

那麼你可以使用cancelFac中的返回函數以這種格式返回一個字符串「num1,num2」。現在在multiplyFraction方法中,分割字符串並獲取a和b的值。

0

此外還可以返回包含NUM1和NUM2的數組:

function cancelFac(num1,num2){ 
    var minVal = Math.min(num1,num2); 
    for(var i=2; i<=minVal; i++){ 
     while(num1%i==0 && num2%i==0){ 
      num1 = num1/i; 
      num2 = num2/i; 
     } 
    } 
    return [num1, num2]; 
} 

var multiplyFraction = function(){  
    var a = notZero(rand(13,0)); 
    var b = notZero(rand(13,0)); 

    //Cancel Common factors 
    var result = cancelFac(a,b); 
    a = result[0]; 
    b = result[1]; 
} 
0

使用返回值中的對象返回的改變的值(或陣列):

function cancelFac(num1,num2){ 
    var minVal = Math.min(num1,num2); 
    for(var i=2; i<=minVal; i++){ 
     while(num1%i==0 && num2%i==0){ 
      num1 = num1/i; 
      num2 = num2/i; 
     } 
    } 
    return({a: num1, b: num2}); 
} 

var multiplyFraction = function(){  
var a = notZero(rand(13,0)); 
var b = notZero(rand(13,0)); 

//Cancel Common factors 
var result = cancelFac(a,b); 
a = result.a; 
b = result.b; 

或者,如果您想要,您可以傳遞一個對象並讓它更改該對象中的值:

function cancelFac(in){ 
    var num1 = in.num1, num2 = in.num2; 
    var minVal = Math.min(num1,num2); 
    for(var i=2; i<=minVal; i++){ 
     while(num1%i==0 && num2%i==0){ 
      num1 = num1/i; 
      num2 = num2/i; 
     } 
    } 
    // set results back into passed in object 
    in.num1 = num1; 
    in.num2 = num2; 
} 

var multiplyFraction = function(){  
var data = {num1: notZero(rand(13,0), num2: notZero(rand(13,0)}; 

//Cancel Common factors 
cancelFac(data); 
// data.num1 and data.num2 contain the two modified values