2012-01-30 124 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