Javascript 为什么这个setTimeout回调会给我一个错误?
我正试图根据请求折叠div,但我的setTimeout函数将不会成功调用其回调函数。代码如下:Javascript 为什么这个setTimeout回调会给我一个错误?,javascript,function,Javascript,Function,我正试图根据请求折叠div,但我的setTimeout函数将不会成功调用其回调函数。代码如下: function newsFeed() { this.delete = function(listingID) { var listing = document.getElementById(listingID); var currHeight = listing.offsetHeight; var confirmDelete = con
function newsFeed() {
this.delete = function(listingID) {
var listing = document.getElementById(listingID);
var currHeight = listing.offsetHeight;
var confirmDelete = confirm("Are you sure you'd like to delete this listing forever?");
if (confirmDelete) {
this.collapse(listingID,currHeight,currHeight,100);
}
}
this.collapse = function(listingID,orig_height,curr_height,opacity) {
var listing = document.getElementById(listingID);
var reduceBy = 10;
if(curr_height > reduceBy) {
curr_height = curr_height-reduceBy;
listing.style.overflow = "hidden";
listing.style.height = (curr_height-40) + "px";
if(opacity > 0) {
opacity = opacity - 10;
var opaque = (opacity / 100);
listing.style.opacity=opaque;
listing.style.MozOpacity=opaque;
listing.style.filter='alpha(opacity='+opacity+')';
}
setTimeout("this.collapse('"+listingID+"',"+orig_height+","+curr_height+","+opacity+")",1);
}
}
}
var newsFeed = new newsFeed();
我在文件中称之为:
<div id="closeMe">
<a onclick="newsFeed.delete('closeMe');">close this div</a>
</div>
关闭这个分区
当它到达这个.collapse中的setTimeout函数时。。。它错误为“this.collapse不是一个函数”。当调用超时时,
此
不再是您想要的。您需要通过其他机制引用所需的DOM元素,可能是基于ID的检索。调用超时时,这不再是您想要的。您需要通过其他机制引用所需的DOM元素,可能是基于ID的检索。当超时调用时,您已退出该函数,“this”不再指您认为它所做的事情
您应该使用闭包,如下所示:
var self = this;
setTimeout(function()
{
self.collapse(listingID, orig_height, curr_height, opacity);
}, 1);
当超时调用时,您已退出该函数,“this”不再指您认为它所做的事情
您应该使用闭包,如下所示:
var self = this;
setTimeout(function()
{
self.collapse(listingID, orig_height, curr_height, opacity);
}, 1);
您看到的行为是因为JavaScript中的范围问题。JavaScript只有两个作用域——函数和全局
执行setTimeout()调用时,如果希望在由于setTimeout()调用而执行的代码中使用该状态,则必须在全局范围中设置变量。这将是解决问题的办法;格雷格已经提出了这样做的方法
您将在Mozilla开发者中心的关于和中找到更多信息。您看到的行为是因为JavaScript中的范围问题。JavaScript只有两个作用域——函数和全局
执行setTimeout()调用时,如果希望在由于setTimeout()调用而执行的代码中使用该状态,则必须在全局范围中设置变量。这将是解决问题的办法;格雷格已经提出了这样做的方法
您可以在Mozilla开发者中心的关于和的页面中找到更多信息。我是将其放在newsFeed()中还是放在this.collapse函数中?aka.“this”实际上指的是什么?…抱歉,因为现在我正在自我恢复。collapse不是一个函数通常setTimeout应该总是与函数一起使用,而不是字符串(这与讨厌的eval
几乎相同)。要将值传递到函数中,您可以使用专用的bind函数to parameters方法,也可以将其放入一个匿名函数中,如Greg的示例中所示。我是将其放入newsFeed()还是this.collapse函数中?aka.“this”实际上指的是什么?…抱歉,因为现在我正在自我恢复。collapse不是一个函数通常setTimeout应该总是与函数一起使用,而不是字符串(这与讨厌的eval
几乎相同)。要将值传递到函数中,您可以使用专用的绑定函数to parameters方法,也可以将其放入一个匿名函数中,如Greg的示例所示。