我基本上想获得颜色的单个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);
}

最佳答案

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){
...
}


另请参见:Is JavaScript a pass-by-reference or pass-by-value language?

10-06 12:19