js中bind函数可以绑定动态变量吗

背景:在测试一个广播效果组件,用Math.random()生成一个随机数传给广播函数
期待的效果如下:
图片描述
数字是随机数

但是使用这样的写法:

    // update为广播函数,传入内容即可
    setInterval(update.bind(null,Math.random()),1000)

效果如下:
图片描述

可以看到通过bind绑定的是一个不变的数字,
问题:怎么改写才能在使用bind的情况下,保持可变数字

阅读 2.5k
3 个回答

首先需要弄明白数字为什么不会变,因为Math.random()只被调用了一次。
可以看一下简易的bind的实现

Function.prototype.bind = function(oThis) {
    var aArgs = Array.prototype.slice.call(arguments, 1);
    var fToBind = this;
    var fBound = function() {
        return fToBind.apply(oThis, args);
    };
    return fBound;
}

由于Math.random()作为bind的第二个参数传进了update方法,所以上面的args里面其实就保存了Math.random()的执行结果。bind函数返回fBound是定时器不断调用的函数,fBound执行的时候args变量的值都是从外部作用域里获得的。
如果希望每次都变的话,把Math.random()放到update函数中去执行就可以了

update也要改成调用函数

function update(n) {
   console.log(n())
}

setInterval(update.bind(null, () => Math.random()),1000)

bind是不可能bind

setInterval(() => {
    update.call(null, Math.random())
}, 1000)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏