对象文本问题 - 返回闭包

Problem with object literal - return closure

提问人:zEn feeLo 提问时间:12/5/2018 最后编辑:Thomas VangeloovenzEn feeLo 更新时间:4/13/2019 访问量:127

问:

我有一个具有不同方法的模块 其中一个方法在 setTimeout 上调用另一个方法,我需要将一些值传递给第二个方法,该方法被调用

首先我这样做了

transitSlide: function() {
        var left = parseInt(this.$ul.first().css('left')),
        newLeft = parseInt(left) + 100 ,
        index = (newLeft / 100),
        bool = (newLeft <= (this.slideShow.length - 1) * 100); // this is always TRUE

        this.$a.removeClass();
        this.$ul.addClass('fade');

        setTimeout(this.changeSlide.bind(this), 400);


        return bool; // I need to pass newLeft variable too !!!
}

changeSlide() {
    if (this.transitSlide) {
        alert('true') // this works!
    } else {
        alert('false')
    }
}

但我需要传递更多值,然后我这样做了

transitSlide: function() {
        var left = parseInt(this.$ul.first().css('left')),
        newLeft = parseInt(left) + 100 ,
        index = (newLeft / 100);

        this.$a.removeClass();
        this.$ul.addClass('fade');

        setTimeout(this.changeSlide.bind(this), 400);

        return  {
        direction: (newLeft <= (this.slideShow.length - 1) * 100) ? true : false, // this is always TRUE
        // direction: true // also doesnt work !!!
        newLeft: newLeft
        }
}

changeSlide() {
    if (this.transitSlide.direction) {
        alert('true')
    } else {
        alert('false') // this doesnt work!
    }
}

但即使我简单地输入真值,它也不会返回第二种方法的真值 然后我发现我应该()调用它 然后我写了

transitSlide: function() {
        var left = parseInt(this.$ul.first().css('left')),
        newLeft = parseInt(left) + 100 ,
        index = (newLeft / 100);

        this.$a.removeClass();
        this.$ul.addClass('fade');

        setTimeout(this.changeSlide.bind(this), 400);

        return  {
        direction: (newLeft <= (this.slideShow.length - 1) * 100) ? true : false, // this is always TRUE
        newLeft: newLeft
        }
}

changeSlide() {
        if (this.transitSlide().direction) {
                alert('true') // this works! but setTimeout call it over and over !!!
        } else {
                alert('false')
        }
}

但是 setTimeout 让它一遍又一遍地运行(不定式循环)

在这种情况下我该怎么办? 如何在不调用它的情况下传递这些值并在第二个函数中访问它们

JavaScript jQuery 模块 闭包 Object-literal

评论

0赞 SLaks 12/5/2018
没有理由写.? true : false
0赞 zEn feeLo 12/5/2018
这不是问题,我什至删除了它并简单地写了true,问题是该函数应该在changeSlide中调用()才能使用返回属性
0赞 Mark 12/5/2018
您正在从超时回调进行调用。并且您正在设置超时。所以它当然会形成一个循环。目前尚不清楚为什么您需要这样做,而不仅仅是设置一个单独的方法,例如并对其进行检查。transitSlide()transitSlide()this.direction()
0赞 zEn feeLo 12/5/2018
谢谢,我可以,但模块已经有太多的函数,我担心这种过多的分离不是正确的方法,我不确定,也有没有办法在其他方法中将这些值作为参数或,,,?
0赞 Scott Weaver 12/5/2018
也许您应该显示调用第一个函数的代码。或者甚至可以尝试向其他人解释您实际上想用这些幻灯片做什么。

答:

0赞 SLaks 12/5/2018 #1

函数返回值不存储在任何地方;它们只是返回给呼叫者。

听起来您实际上想将该状态作为参数传递给第二个函数,当您使用以下命令调用它时:setTimeout()

setTimeout(() => otherFunction(parameters))

评论

0赞 zEn feeLo 12/5/2018
感谢您的回答,我尝试将这 2 个变量(newLeft 和指示方向的布尔值)从 transitSlide() 方法传递给 changeSlide() 方法
0赞 SLaks 12/5/2018
您可以传递两个参数,就像传递一个参数一样。
0赞 zEn feeLo 12/5/2018
你的意思是归还一些东西;返回另一个;在下一行而不是对象文本中
1赞 SLaks 12/5/2018
不;我的意思是传递参数,而不是返回值。
0赞 zEn feeLo 12/5/2018
你能给我一个例子或这个方法的链接吗
0赞 zEn feeLo 12/8/2018 #2

using 方法传递参数和关键字apply()this

transitSlide: function() {
    var left = parseInt(this.$ul.first().css('left')),
        newLeft = parseInt(left) + 100 ,
        index = (newLeft / 100),
        direction = (newLeft <= (this.slideShow.length - 1) * 100);


    this.$a.removeClass();
    this.$ul.addClass('fade');

    setTimeout(this.changeSlide.apply(this, [direction, newLeft]), 400);

},

changeSlide(direction, newLeft) {
    if (direction) {
        alert(true)
    } else {
        alert(false)
    }
},