Javascript:用外部函数更改内部变量?

时间:2012-01-30 04:35:51

标签: javascript function variables

我正在尝试运行一个函数来取消两个数字之间的公因数。取消函数在我的包装函数“multiplyFraction”之外,它不会改变multiplyFraction中的变量。

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中时,它工作得很好,但是我想让取消因子成为它自己的函数,因为我需要经常这样做。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

a和b的值将保持不变,因为它们是基本类型,而原始类型是按值传递而不是引用。如果要保持对传递的值进行的更改,则通过引用传递值,即传递对象而不是基本类型。或者从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);
}

答案 1 :(得分:0)

你可以使用cancelFac中的return函数返回一个格式为“num1,num2”的字符串。现在在multiplyFraction方法中,拆分字符串并获取a和b的值。

答案 2 :(得分: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];
}

答案 3 :(得分: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