bing与call/apply的区别

  1. var p1={
  2. name:'张三',
  3. hobby: this.hobby,
  4. play: function(sex,age){
  5. console.log('年龄为'+age+'岁,性别为'+sex+'的',this.name+'喜欢'+this.hobby);
  6. }
  7. }
  8. var p2={
  9. name:'李四',
  10. hobby:'踢足球'
  11. }
  12. 使p1this指向指向p2,call改变this的指向并立即执行,
  13. bind改变this指向后返回一个新的函数,不执行
  14. p1.play.call(p2,'男',20);
  15. p1.play.apply(p2,['男',20]);
  16. var fn=p1.play.bind(p2,'男',20);
  17. fn();

image.png

  1. ;(function(){
  2. var tab=function(){
  3. this.tab=document.getElementsByClassName('tab')[0];
  4. this.tabs=document.getElementsByClassName('t-item');
  5. this.pages=document.getElementsByClassName('p-item');
  6. }
  7. Tab.prototype={
  8. init:function(){
  9. this.bindEvent();
  10. },
  11. bindEvent: function(){
  12. var _self=this;
  13. //此处事件处理函数,一般都放在外面,单独写
  14. this.tab.addEventListener('click',function(){
  15. _self.tabClick.call(_self);//或者 this.tab.addEventListener('click',this.tabClick.bind(this),false)
  16. },false); //如果上面的把bind替换成call,就会直接执行了
  17. },
  18. tabClick: function(e){
  19. console.log(e)
  20. }
  21. }
  22. return new Tab().init();
  23. })

重写bind方法

bind 是挂载在Function.prototype
用apply模拟bind

  1. Function.prototype.bindy=function(context){
  2. var _self=this,
  3. args=Array.prototype.slice.call(arguments,1);
  4. return function(){
  5. var newArgs=Array.prototype.slice.call(arguments);
  6. _self.apply(context,args.concat(newArgs))
  7. }
  8. }
  1. var p={
  2. age: 20
  3. }
  4. function Person(name,sex){
  5. console.log(this);
  6. console.log(this.age);
  7. console.log(name,sex);
  8. }
  9. Function.prototype.bindy=function(context){
  10. var _self=this,
  11. args=Array.prototype.slice.call(arguments,1);
  12. return function(){
  13. var newArgs=Array.prototype.slice.call(arguments);
  14. _self.apply(context,args.concat(newArgs))
  15. }
  16. }
  17. var p2=Person.bindy(p,'zhangsan'); //此时的bingy的this指向不对
  18. new p2('男');
  19. var p2=Person.bind(p,'zhangsan');
  20. new p2('男');

image.png
改为下面的形式就可以了(2021.06.21不懂)

  1. Function.prototype.bindy=function(context){
  2. var _self=this,
  3. args=Array.prototype.slice.call(arguments,1);
  4. var fn= function(){
  5. var newArgs=Array.prototype.slice.call(arguments);
  6. _self.apply(this instanceof _self?this:context,args.concat(newArgs))
  7. }
  8. fn.prototype=this.prototype;
  9. return fn;
  10. }
  11. var p2=Person.bindy(p,'zhangsan');
  12. new p2('男');
  13. // var p2=Person.bind(p,'zhangsan');
  14. // new p2('男');

image.png