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个回答

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]

camiZeng_01
camiZeng_01 哦~~这下更明白了,3q
接近 8 年之前 回复
blogzhoubo
blogzhoubo 订正一下,bind返回的不是load方法,而是 function(){ _method.apply(object,arguments); } setInterval会每隔1秒调用这个方法,这个方法里面实际调用了load方法
接近 8 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐