在JavaScript中传递对象和函数名

在JavaScript中传递对象和函数名,javascript,Javascript,我创建了一个对象,其中包含多个对象的名称以及与创建新对象(在本例中为图表)相关联的函数的名称 var oCharts = [{ nchart: "chart1", fchart: "makeChart1" }, { nchart: "chart2", fchart: "makeChart2" }, { nchart: "chart3", fchart: "makeChart3" } ] “nchart”是表示要销毁的图表的变量

我创建了一个对象,其中包含多个对象的名称以及与创建新对象(在本例中为图表)相关联的函数的名称

var oCharts = [{
    nchart: "chart1",
    fchart: "makeChart1"
  },
  {
    nchart: "chart2",
    fchart: "makeChart2"
  },
  {
    nchart: "chart3",
    fchart: "makeChart3"
  }
]
“nchart”是表示要销毁的图表的变量。 “fchart”是表示创建新图表的函数的变量

如果我像这样手动操作,它就会工作

if(typeof chart1 != undefined ){
  chart1.destroy();
  makeChart1();         
}   
如果我迭代oCharts,它就不起作用了。我得到了“对象不支持属性或方法‘destroy’”,当然,它永远都不足以运行makeChart()。(我甚至不确定我的说法是否正确。)

制作图表的功能很简单

function makeChart1(){
 // do stuff
}

function makeChart2(){
 // do other stuff
}

function makeChart3(){
 // do different stuff
}
有人能告诉我我做错了什么吗?非常感谢

需要注意两件事:

var chart1 = {destroy:function(){console.log('chart1')}}
var chart2 = {destroy:function(){console.log('chart2')}}
var chart3 = {destroy:function(){console.log('chart3')}}
function makeChart1(){
console.log('make chart 1');
}

function makeChart2(){
 // do other stuff
  console.log('make chart 2');
}

function makeChart3(){
 // do different stuff
  console.log('make chart 3');
}

var oCharts = [{
    nchart: chart1,
    fchart: makeChart1
  },
  {
    nchart: chart2,
    fchart: makeChart2
  },
  {
    nchart: chart3,
    fchart: makeChart3
  }
]
$(oCharts).each(function(i,v){

  var myChart = this.nchart;
  var makeChart = this.fchart;

  if(typeof myChart != undefined ){
    myChart.destroy();
    makeChart();            
  }
});
1) 您要查找的关键字不是
destroy
,而是
delete
。它不是一个函数,它是一个操作符:

设a={b:3,c:4};
删除a.b;
控制台日志(a)需要注意两件事:

1) 您要查找的关键字不是
destroy
,而是
delete
。它不是一个函数,它是一个操作符:

设a={b:3,c:4};
删除a.b;

控制台日志(a)我相信这可以用一种更智能的方式完成,但这应该适用于您的示例: 我假设chart1、chart2、chart3是已经创建为
var chart1=new chart(ctx,config)

动态更新以供使用: 看看这个()


希望这能有所帮助。

我相信这可以用一种更聪明的方式完成,但这应该适用于您的示例: 我假设chart1、chart2、chart3是已经创建为
var chart1=new chart(ctx,config)

动态更新以供使用: 看看这个()



希望对您有所帮助。

这些函数是如何定义的?If必须使用
eval
动态计算,以通过字符串而不是其引用调用函数,这是一个坏主意。当您在myChart的
字符串上使用
()
时,遇到了错误。myChart的
类型
字符串
并且只有函数具有调用属性,您如何销毁图表???图表是使用chart.js制作的。chart1.destroy()是销毁它们以创建具有相同ID的新图表的方式。您的表达式
typeof myChart!=undefined
始终为true,因为
typeof variable
始终返回
string
type,您应该将其与
undefined
的字符串化值进行比较,即
typeof myChart!='未定义“
此外,在此表达式之前,您还创建了一个变量`var myChart=[this.nchart];`<代码>myChart的类型
始终将返回“object”。为了防止这种情况发生,您只需将
this.nchart
分配给
myChart
抱歉,谢尔盖。但是,如果myChart尚未创建,myChart的类型将未定义,因此无法销毁。我试图将图表的ID传递到条件中,如果定义了具有该ID的对象,则销毁它。函数是如何定义的?If必须使用
eval
动态计算,以通过字符串而不是其引用调用函数,这是一个坏主意。当您在myChart的
字符串上使用
()
时,遇到了错误。myChart的
类型
字符串
并且只有函数具有调用属性,您如何销毁图表???图表是使用chart.js制作的。chart1.destroy()是销毁它们以创建具有相同ID的新图表的方式。您的表达式
typeof myChart!=undefined
始终为true,因为
typeof variable
始终返回
string
type,您应该将其与
undefined
的字符串化值进行比较,即
typeof myChart!='未定义“
此外,在此表达式之前,您还创建了一个变量`var myChart=[this.nchart];`<代码>myChart的类型
始终将返回“object”。为了防止这种情况发生,您只需将
this.nchart
分配给
myChart
抱歉,谢尔盖。但是,如果myChart尚未创建,myChart的类型将未定义,因此无法销毁。我试图将图表的ID传递到条件中,如果定义了具有该ID的对象,则销毁它。感谢您的帮助,junvar。但是使用chart.js mychartname.destroy()是函数。谢谢你的帮助,junvar。但是在chart.js中,mychartname.destroy()是函数。Alex,这就是我想要的。但我不想为每个图表创建单独的IF语句。这就是为什么我要把他们的身份证放在Ochart对象中。所以我可以在oCharts上迭代,销毁当前图表,创建一个新图表,然后继续。@ChrisG。检查此更新,并让我知道是否工作oooh!我要试一试,这正是我想要的,亚历克斯。但我不想为每个图表创建单独的IF语句。这就是为什么我要把他们的身份证放在Ochart对象中。所以我可以在oCharts上迭代,销毁当前图表,创建一个新图表,然后继续。@ChrisG。检查此更新,并让我知道是否工作oooh!我要试一试。
var chart1 = {destroy:function(){console.log('chart1')}}
var chart2 = {destroy:function(){console.log('chart2')}}
var chart3 = {destroy:function(){console.log('chart3')}}
function makeChart1(){
console.log('make chart 1');
}

function makeChart2(){
 // do other stuff
  console.log('make chart 2');
}

function makeChart3(){
 // do different stuff
  console.log('make chart 3');
}

var oCharts = [{
    nchart: chart1,
    fchart: makeChart1
  },
  {
    nchart: chart2,
    fchart: makeChart2
  },
  {
    nchart: chart3,
    fchart: makeChart3
  }
]
$(oCharts).each(function(i,v){

  var myChart = this.nchart;
  var makeChart = this.fchart;

  if(typeof myChart != undefined ){
    myChart.destroy();
    makeChart();            
  }
});
$(oCharts).each(function(i,v){
  var myChart = this.nchart;
  var makeChart = this.fchart;

  if( myChart == "chart1" ){
    chart1.destroy();
    makeChart1();
  }
  if( myChart == "chart2" ){
    chart2.destroy();
    makeChart2();
  }
  if( myChart == "chart3" ){
    chart3.destroy();
    makeChart3();
  }
  }
);
$(oCharts).each(function(i,v){
  var myChart = this.nchart;
  var makeChart = this.fchart;


    self[myChart].destroy();
    self[makeChart]()


  }
);