提问人:zEn feeLo 提问时间:12/5/2018 最后编辑:Thomas VangeloovenzEn feeLo 更新时间:4/13/2019 访问量:127
对象文本问题 - 返回闭包
Problem with object literal - return closure
问:
我有一个具有不同方法的模块 其中一个方法在 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 让它一遍又一遍地运行(不定式循环)
在这种情况下我该怎么办? 如何在不调用它的情况下传递这些值并在第二个函数中访问它们
答:
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)
}
},
评论
? true : false
transitSlide()
transitSlide()
this.direction()