camiZeng_01 2012-11-08 15:39
浏览 244
已采纳

obj.load.bind(obj),执行结果求解释

Function.prototype.bind=function(object){ var _method=this; return function(){ _method.apply(object,arguments); } } function TestObj(){} TestObj.prototype.load=function(){alert("obj's load");} var newObj=new TestObj(); [color=red]newObj.load.bind(newObj); window.setInterval(newObj.load.bind(newObj),1000);[/color]

本人是js菜鸟,对于上面代码,红色标记处执行结果不是很懂。求解、或提示。
newObj.load.bind(newObj);执行了load的bind方法,将object做了绑定,不会执行load方法。
window.setInterval(newObj.load.bind(newObj),1000);此句做循环时,为什么能循环执行load方法呢??load.bind只做了一次。

  • 写回答

1条回答 默认 最新

  • blogzhoubo 2012-11-09 09:37
    关注

    1.
    newObj.load.bind(newObj);
    这行代码调用了bind方法,返回了下面这个函数:
    function(){
    _method.apply(object,arguments);
    }

    但是,并没有对返回值进行保存,所以仅仅是把load函数
    function(){alert("obj's load");}
    赋给了_method变量,并且把object绑定到_method方法。
    只是返回load方法的定义,并不会执行load方法。

    2.
    window.setInterval(newObj.load.bind(newObj),1000);
    这样代码具体执行了下面的操作:
    (1)执行newObj.load.bind(newObj),和前面的1.一样
    (2)(1)执行完返回的结果(也就是load方法)作为setInterval方法的第一个参数传给setInterval方法,还有1000也传给setInterval方法
    (3)执行setInterval方法
    (4)setInterval方法内部会每隔1秒调用load方法

    从上面的1.和2.可以看出,1.扔掉了bind的返回值。2.把返回值传给了setInterval方法,使得setInterval方法可以每隔1秒调用到load方法。

    其实第一行红色代码是多余的,可以删掉。
    把代码修改成下面这样更容易理解:

    [code="js"]var newObj=new TestObj();

    var m = newObj.load.bind(newObj);

    window.setInterval(m,1000); [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 如何用visual studio code实现html页面
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?