阅读 258

javascript中的this,call,apply,bind

(一):this
  
1:在javascript中this指的就是函数运行时所在的上下文(即函数的运行环境);
  

    var name = ‘张三‘;
    var obj = {
        name: ‘法外狂徒‘,
        action: function () {
            console.log(this.name + ‘的行为!‘);
        }
    }
    var action = obj.action;
    obj.action()  // 法外狂徒的行为;
    action() //  张三的行为

 

  上面代码中obj.action和action指向的是内存中的同一个函数(obj.action和action的值都是指向这个函数的地址),但是函数中的this指向却不相同。obj.action()中this指向obj这个对象,而action()可以写成window.action(),故this指向window。取当前环境中的name故而输出不同。

(二):call 、apply、 bind
    call,apply,bind都是改变this指向的函数。

    var name = ‘张三‘;
    var obj = {
        name: ‘法外狂徒‘,
        action: function () {
            console.log(this.name + ‘的行为!‘);
        }
    }
    var action = obj.action;

    obj.action.call()  // 张三的行为;
    obj.action.apply()  // 张三的行为;
    let temAction = ‘‘;
    temAction = obj.action.bind();
    temAction() //  张三的行为

   注意:call,apply,bind,在非严格模式中第一个参数不传或者传null、undfined时,this指向window(即全局环境);在严格模式中传谁this就指向谁,null指向null,不传或者传undefined就指向undefined;

 

    1:fn.call()
   当调用函数原型对象中的call()方法时会进行以下几步操作:
    (1):首先改变操作函数中的this,使其指向call方法中的第一个实参;
    (2):执行操作函数并把call方法中第一个实参以后的实参传给操作函数;
     2:区别:
    (1):call和apply唯一的区别就是参数的形式不同,除了第一个参数外,剩下的参数call以列表的形式一个一个传,而apply则放到一个数组中,看例子

    let arr = [2,5,3,8,9,4];
    Math.max.call(...arr) // 9
    Math.max.apply(null,arr) // 9

 

    (2):bind和apply的区别在于是立刻执行目标函数还是等待执行,apply是立即执行,bind则只是改变了目标函数中this的指向之后返回一个函数,不立马执行目标函数;

(三)手动实现一个call方法


    

  


  

  

原文:https://www.cnblogs.com/blcorder/p/15008958.html

文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐