先看一个常见的例子
setTimeout 闭包代码闭包
//代码段(1) for(var i=0;i<5;i++){ setTimeout(console.log.bind(null,i),i*1000); }
输出: 打印为每间隔1s依次递增打印i。函数
疑问: 若是把bind改为call将会是什么效果呢?this
//代码段(2)内部打印函数当即自执行 for(var i=0;i<5;i++){ setTimeout(console.log.call(null,i),i*1000); }
输出: 一次性所有打印递增i,并未达到计时器效果。code
原理解释:
bind(arg1,arg2,arg3...),call(arg1,arg2,arg3...)函数,arg1做用为更改this指向,其他arguments为预设值。
区别: bind函数并不会当即执行,而call函数会当即执行。这就是为何call函数会一次性打印的缘由。io
//代码段(3) //代码段 (3) == 代码段(1) for(var i=0;i<5;i++){ setTimeout(function(index){ console.log(index); }.bind(null,i),i*1000); }
//代码段 (4)内部打印函数当即自执行 //代码段 (4)== 代码段(2) for(var i=0;i<5;i++){ setTimeout((function(index){ console.log(index); }.bind(null,i))(i),i*1000); }
若是想用call函数,可是阻止自执行肿么办捏?很简单,内部再加个function做为返回值console
for(var i=0;i<10;i++){ setTimeout(function(index){ return function(){ console.log(index); } }.call(null,i),i*1000); }