d3.js:使用函数时如何访问外部作用域中的数据(d){...}

时间:2014-06-16 18:31:16

标签: javascript d3.js

很抱歉这个奇怪的标题,但我不确定这些函数叫什么:

options: {
  someTrait: function(d) { return doSomething(d, outerScopeArray[i]); }
}

起初我认为它们是匿名函数,但它不知何故期望第一个变量成为某种东西。所谓的内容对我来说更有用了。

我遇到的问题是我希望这个函数访问外部作用域中的变量。 (outerScopeArray [i])它目前总是未定义的。

编辑:这就是实际被称为

的方式
  testDurations[i] // data here is accessible, this section is repeated multiple times in a loop

  $(newGraph).lineChart({

            options: {           
              tickFormat: function(d) { 
                //testDurations[i] here is undefined.
                console.log("testing durations", testDurations[i], "--", 10*60000)
                if (testDurations[i] <= 10*60000){
                  return d3.time.format('%H:%M:%S')(new Date(d)); 
                }
                else{
                  return d3.time.format('%H:%M')(new Date(d)); 
                }
              },

     });

2 个答案:

答案 0 :(得分:0)

多一些代码会有所帮助(我不太确定你在哪里使用它),但是如果你试图根据数据元素的索引访问一个数组,你可以使用:

function(d,i) { return doSomething(d, outerScopeArray[i]); }

此处,i将包含当前数据元素d的索引。

答案 1 :(得分:0)

我设法冻结了这样的值,同时仍然返回一个符合d3.js协议的函数。

//define this outside the for loop
var tickFormatFunction = function (v) {
     return function(d) { 
            console.log("testing durations",  v , "--", v)
            if (v >= 10*60000){
              return d3.time.format('%H:%M')(new Date(d)); 
            }
            else{
              return d3.time.format('%H:%M:%S')(new Date(d)); 
            }
    }
  }

//call like this
tickFormat: tickFormatFunction(testDurations[i]),