[英]Javascript: Cannot call method of undefined
这可能是一个常见的错误,但我找不到另一种方法。 我正在使用timeline.js
创建一个显示多个项目的timeline.js
其中包含以下代码
function createTimeline(){
for(var length = data.section.length,i = 0; i < length; i++){
var divWrapper = document.createElement("div");
if(i != data.section.length - 1)
divWrapper.setAttribute('class','timelineWrapper');
$('body').append(divWrapper);
layer[i] = new links.Timeline(divWrapper);
links.events.addListener(layer[i], 'rangechange',
function(){
var that = this;
var range = layer[i].getVisibleChartRange();
for (var j = 0; j < layer.length; j++){
if(j != i){
layer[j].setVisibleChartRange(range.start, range.end);
}
}
}
);
layer[i].draw(data.section[i].project, options);
}
}
它给出了错误Cannot call method 'getVisibleChartRange' of undefined
。 这里有什么问题? 为什么layer [i]未定义? 在事件范围更改期间未检测到它。
导致该问题是因为用作事件处理程序的未命名函数使用其父作用域的i变量。 在循环结束时,i == data.section.length在此范围内。
这也是所有事件处理程序的i值。 因此,layer [i]未定义,这导致错误消息。
解决此问题的最简单方法是创建一个函数构造函数,将i作为参数并返回一个新函数(您的处理程序)。 在此返回的处理程序的直接父级作用域中,i值将是您传递给functionBuilder函数的参数。
我今天晚些时候会发布一些代码示例,只要我可以访问一台电脑(我无法从平板电脑输入:o))
编辑:我太慢了... mc10或多或少发布了我想发布的内容:o)
如果您不理解为什么这样做,或者闭包,范围或绑定意味着什么,这里有一个古老而完整的解释: http : //blog.niftysnippets.org/2008/02/closures-are-not-complicated。 HTML
您必须在闭包内绑定i
以保存其addListener
调用的值,因为稍后调用addListener
的函数时, i
将未定义。 尝试使用以下代码替换addListener
调用的第三个参数:
(function(i) {
return function() {
var that = this;
var range = layer[i].getVisibleChartRange();
// Rest of code
};
}(i)); // Anonymous function binds i in a closure
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.