javascript如何"修复"函数内部的变量,通过eval?

时间:2015-10-08 19:29:39

标签: javascript arrays loops eval

我有以下功能

var label = function() {
  return 'File: '+texts[t];
};

附加到highcharts,在此处指定 http://api.highcharts.com/highcharts#plotOptions.pie.dataLabels.formatter

其中t的值为1到10,text[t]对应不同的文字。我将此函数附加到10 highchart tooltips,以便它使用mouseOver事件执行函数。

预期的逻辑是图表1出现text[1]标签,图表6有text[6]等等。

问题是所有图表都出现text[10],因为t在执行函数时具有该值。

我该如何解决这个问题?它是eval()喜欢

的地方吗?
var label = function() {
  return 'File: '+eval(texts[t]);
};

更新:根据评论,尝试

var label = function(t) {
  return 'File: '+t+' '+texts[t];
};

没有按预期工作,它打印"文件:[object Object] undefined"

2 个答案:

答案 0 :(得分:2)

这是一个非常常见的关闭问题:

你可能有一个for循环,只需将处理程序附加到另一个函数中的代码包裹起来:

// This will not work the way you might expect
// The value of i is left at 10 because that is the last 
// time it is changed in the attacheHandlers1 scope held
// but the closure in the anonymous function used as a callback
// in setTimeout
//
function attachHandlers1(){
  for(var i = 0; i < 10 ; i++){
     setTimeout(function(){
        console.log("Version 1", i);
     }, 100)
  }
}

// This works because the value is closured in 
// attachHandlerImpl as 'x' with different values for 
// each invocation
//
function attachHandlers2(){
  for(var i = 0; i < 10 ; i++){
     attachHandlerImpl(i);
  }
}

function attachHandlerImpl(x){
     setTimeout(function(){
        console.log("Version 2", x);
     }, 100);
}

attachHandlers1();

attachHandlers2();

将输出:

Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 1 10
Version 2 0
Version 2 1
Version 2 2
Version 2 3
Version 2 4
Version 2 5
Version 2 6
Version 2 7
Version 2 8
Version 2 9

答案 1 :(得分:0)

在不知道其余实施细节的情况下,这样的事情可以起作用:

var texts = ['Text 1', 'Text 2', 'Text 3']
var label = function(idx) {
  return "File: " + texts[idx];
};

label(2)返回&#34;文件:文字3&#34;