我有一个全局变量:
var chart;
创建图表的功能:
function setChart(variableName, chartContainer){
variableName = new CanvasJS.Chart(chartContainer, {**params**});
variableName.render();
};
我调用setChart
setChart(chart, "chartContainDiv");
如果我稍后致电chart.render();
,则无效。
我怎样才能做到这一点? /我有什么误解?
答案 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"