JavaScript: изменить внутреннюю переменную с внешней функцией? - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь запустить функцию, чтобы отменить общие факторы между двумя числами. Функция отмены находится вне моей функции-оболочки «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 ]

1 голос
/ 30 января 2012

Значения 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);
}
0 голосов
/ 30 января 2012

Используйте возвращаемое значение для возврата измененных значений в объекте (или массиве):

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
0 голосов
/ 30 января 2012

Кроме того, вы также можете вернуть массив, содержащий 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 голосов
/ 30 января 2012

Ну, вы можете использовать функцию return в cancelFac, чтобы вернуть вам строку в этом формате "num1, num2". Теперь в методе multiplyFraction разбейте строку и получите значения a и b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...