背景:在测试一个广播效果组件,用Math.random()生成一个随机数传给广播函数
期待的效果如下:
数字是随机数
但是使用这样的写法:
// update为广播函数,传入内容即可
setInterval(update.bind(null,Math.random()),1000)
效果如下:
可以看到通过bind绑定的是一个不变的数字,
问题:怎么改写才能在使用bind的情况下,保持可变数字
背景:在测试一个广播效果组件,用Math.random()生成一个随机数传给广播函数
期待的效果如下:
数字是随机数
但是使用这样的写法:
// update为广播函数,传入内容即可
setInterval(update.bind(null,Math.random()),1000)
效果如下:
可以看到通过bind绑定的是一个不变的数字,
问题:怎么改写才能在使用bind的情况下,保持可变数字
update也要改成调用函数
function update(n) {
console.log(n())
}
setInterval(update.bind(null, () => Math.random()),1000)
8 回答4.9k 阅读✓ 已解决
6 回答3.7k 阅读✓ 已解决
5 回答3k 阅读✓ 已解决
5 回答6.5k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
首先需要弄明白数字为什么不会变,因为Math.random()只被调用了一次。
可以看一下简易的bind的实现
由于Math.random()作为bind的第二个参数传进了update方法,所以上面的args里面其实就保存了Math.random()的执行结果。bind函数返回fBound是定时器不断调用的函数,fBound执行的时候args变量的值都是从外部作用域里获得的。
如果希望每次都变的话,把Math.random()放到update函数中去执行就可以了