Javascript 为什么这个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

我正试图根据请求折叠div,但我的setTimeout函数将不会成功调用其回调函数。代码如下:

 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的示例所示。