在下面的代码中,pushElement方法在处理“words”变量时工作正常,但是一旦我运行popElement方法,它就会在“this.words.length”上失败并出现以下错误: “未捕获的TypeError:无法读取未定义的属性'长度'”。
有什么想法吗?
function AnimationStack() {
this.words = [];
}
AnimationStack.prototype.pushElement = function(element) {
this.words.push(element);
}
AnimationStack.prototype.popElement = function() {
if (this.words.length>0) {
var element = this.words.shift();
return element;
} else {
return null;
}
}
var AS = new AnimationStack();
var element = $("<div></div>");
AS.pushElement(element); // works perfect
AS.pushElement(element); // works perfect
AS.pushElement(element); // works perfect
var pop = AS.popElement(); // always fails
编辑:上面的代码是完美的。在我实际执行的方式中,我使用上面的代码。我正在使用setInterval调用popElement()来改变“this”的范围。阅读完整的答案:
http://forrst.com/posts/Javascript_Array_Member_Variable_is_Undefined_wi-g6V
答案 0 :(得分:1)
@Chad已找到答案,但这是解释。
如果你这样调用这个函数:
AS.popElement();
popElement函数在AS对象的上下文中运行(意思是“this”指AS)。但是如果你使用这样的setInterval(或任何回调式函数):
setInterval(AS.popElement, 1000);
您只是传递对popElement函数的引用。因此,当popElement在1000毫秒后执行时,它将在全局上下文中执行(意味着“this”指的是窗口)。如果你打电话,你会得到同样的错误:
window.popElement();
避免这种情况的另一种方法是执行以下操作:
setInterval(function() { return AS.popElement() }, 1000);
另一种选择可能是使用apply或call方法明确设置上下文:
setInterval(AS.popElement.apply(AS), 1000);