2

我基本上想获取颜色的单个 r,g,b 值并将其存储在一个对象中,以便我可以访问单个值。split 函数拆分变量 colorVar 的 rgb 值,并希望在我在下面提供的其他函数中调用 varHolder。但是当我想在 console.log 中显示该值时,它会以未定义的错误进行标记。

我尝试制作 lineObj 全局变量,但它没有用。

function comparision(){
    split(colorL,lineObj);
    console.log('---------get-------');
//This log doesn't work
    console.log(lineObj.r);
}

function split(colorVar,varHolder){
    colorRgb = colorVar.slice(colorVar.indexOf('(') + 1, colorVar.indexOf(')'));
    var colorArr = colorRgb.split(','),
    i = colorArr.length;

    while (i--)
    {
    colorArr[i] = parseInt(colorArr[i], 10);
    }

    varHolder = {
    r: colorArr[0],
    g: colorArr[1],
    b: colorArr[2],
    a: colorArr[3]
    }
//The below log works.
    console.log('-----------Split-------')
    console.log(varHolder.r);
}
4

1 回答 1

2

您更改的值split()不会传播回您的调用函数comaprison(),因为参数 varHolder 是按值传递,而不是按引用传递。这意味着对函数内变量的任何更改仅对该函数是局部的。要解决这个问题,您必须return将新变量添加到外部函数。

    varHolder = {
    r: colorArr[0],
    g: colorArr[1],
    b: colorArr[2],
    a: colorArr[3]
    }
    //The below log works.
    console.log('-----------Split-------')
    console.log(varHolder.r);

    return varHolder;
}

function comparision(){
    lineObj = split(colorL,lineObj);
    console.log('---------get-------');
    //This log doesn't work
    console.log(lineObj.r);
}

如果这是您的整个代码,则可以通过varHolder完全从函数中删除参数来进一步简化,因为函数从不使用它,除非将其分配给新变量。例如:

lineObj = split(lineObj);

function split(colorVar){
...
}

另请参阅:JavaScript 是按引用传递还是按值传递语言?

于 2013-08-06T14:37:06.390 回答