将字符串传递给函数不会设置变量名称

时间:2014-09-09 13:35:15

标签: javascript

我有一个全局变量:

var chart;

创建图表的功能:

function setChart(variableName, chartContainer){

variableName = new CanvasJS.Chart(chartContainer, {**params**});

 variableName.render();

};

我调用setChart

setChart(chart, "chartContainDiv");

如果我稍后致电chart.render();,则无效。

我怎样才能做到这一点? /我有什么误解?

3 个答案:

答案 0 :(得分:3)

由于您将字符串传递给函数,因此您最终会尝试分配此字符:

setVar("globalVar");
// In setVar...
"globalVar" = 5

显然不起作用。传递变量名称本身将几乎按预期工作:

setVar(globalVar);
// In setVar...
globalVar = 5

<强>无论其

由于范围可变,在setVar功能中,您有一个本地变量,其名称与全局相同。在此处执行任何分配只会将本地变量设置为5,其中全局变量将保持原来的任何值。

var myVar = 1;
function setVar(globalVar) { globalVar = 5; alert(globalVar); }
setVar(myVar); // alerts 5
alert(myVar); // alerts 1

有趣的是,如果您传入字符串,那么您可以通过window对象上的数组访问来设置它:

setVar("globalVar");
// In setVar...
window[variableName] = 5; // window["globalVar"] = 5;

但尝试通过传递变量本身来做到这一点并不起作用......

setVar(globalVar);
// In setVar...
window[globalVar] = 5; // window["5"] = 5 // or whatever globalVar contains

这是TLDR版本,这是你在OP中尝试做的完全的唯一方法(尽管还有其他方法,如Ahmad&#39;回答,你设置一个特定的变量而不传递它:)

var myVar = 1;
function setVar(varName) { window[varName] = 5; }
setVar('myVar');

答案 1 :(得分:0)

首先,您必须明确变量和全局变量的范围。在您的示例中,没有将globalVar设置为5的行。您只需将名为variableName的函数setVar的局部变量设置为5。

你应该做的是:

var globalVar;

function setVar(){
  globalVar = 5;
};

现在,如果您想拥有一个全局变量或一组全局变量,那么您应该将它们放在一个对象中,然后使用一个函数来获取该变量名称和您要分配的可选值。

    var globalVariables = {"globalvar1" : "", "globalvar2" : "", .... };
    function setGlobalVar(variableName, Value) {
       globalVariables[variableName] = value;
    }

setGlobalVar ('globalvar1', 5); // this would do it

答案 2 :(得分:0)

将函数用作返回图表对象的factory,而不是将其传递给空变量。这使用了完全相同的概念,通过创建一个对象然后返回该对象,但为了简单起见,它没有使用CanvasJS对象:

function setChart(chartContainer) {
    var variableName = new String(chartContainer);
    return variableName.toUpperCase();
};

var chart = setChart("chartContainDiv");
var chart2 = setChart("blahBlah");
console.log(chart.toString());    // "CHARTCONTAINDIV"
console.log(chart2.toString());   // "BLAHBLAH"

http://jsfiddle.net/n8Lg4wqy/3/