• 【Vue源码相关】JS中call()和apply()以及bind()的区别


      一、方法定义:

    • apply:将函数绑定到某个对象,apply()不会创建一个函数,函数体内的this对象的值会被绑定到传入apply()中的第一个参数的值,例如:f.apply(obj),实际上可以理解为obj.f(),这时f函数体内的this指向的是obj;
    • call:将函数绑定到某个对象,call()不会创建一个函数,函数体内的this对象的值会被绑定到传入call()中的第一个参数的值,例如:f.call(obj),实际上可以理解为obj.f(),这时f函数体内的this指向的是obj;
    • bind:将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()中的第一个参数的值,例如:f.bind(obj)()(bind创建的是一个函数,必须调用才会被执行),实际上可以理解为obj.f(),这时f函数体内的this指向的是obj;

     上面的定义看一遍是很懵的,不过自己遍写例子遍反复读的时候,会有种拨开云雾的感觉。

    相同点:

    • 方法的含义是一样的,即方法功能是一样的;
    • 第一个参数的作用是一样的;

     不同点:传入的列表形式不一样

    • call可以传入多个参数;
    • apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入
    • bind同call一样可以传入多个参数,但bind(obj)后需多加一个括号bind(obj)(),因为bind创建的是一个函数,必须调用才会被执行

      二、问题:

    结果:

    解决方法1:这种解决方法通常适用于继承的场景
    传参时:
    结果:
    解决方法2:通过赋值的方式将this赋值给_this即可
    var a = {
        b: function() {
          var _this = this; // 通过赋值的方式将this赋值给_this
          var func = function() {
            console.log(_this.c);
          }
          func();
        },
        c: 'hello'
      }
      a.b(); // hello
      console.log(a.c); // hello
  • 相关阅读:
    Linux下openSSL安装并颁发证书
    js控制自动上传文件
    Swoole 4.5v安装使用
    Flask-SQLAlchemy 的基本使用
    Flask入门之二
    微信消息订阅
    Flask入门之一
    MySQL主从库快速搭建
    FastAPI连接mysql傻瓜式
    UOJ Round总结
  • 原文地址:https://www.cnblogs.com/vickylinj/p/13220325.html
Copyright © 2020-2023  润新知