这次再忘什么是this,我就直播吃电脑

我们都知道,调用一个函数一共有四种调用模式:

  • 方法调用模式

    • 定义:当一个函数被保存为对象的一个属性的时候,这个函数被称为方法。
    • 此时的this:当一个方法被调用的时候,this绑定到该对象上。
    • 举例子
      var obj = {
      name:"harrisking",
      foo: function(){
      console.log(this.name);//harrisking
      //这里的this指的就是obj;
      }
      }
  • 函数调用模式

    • 定义:当一个函数并非一个对象的属性时,则这个函数就是一个函数来调用的。
    • 此时的this:以此模式调用函数时,this被绑定到全局对象(window)。
    • 举例子
      var a = function(){
      console.log(this.b())
      }
      var b = function(){
      console.log("马达,又躺枪!")
      }
      a();//"马达,又躺枪!"
  • 构造器调用模式

  • 定义:如果一个函数前面带上一个new来调用,则该函数就是作为构造函数来调用的。

    • 这里要补充一个重要的知识点——new到底做了些啥?
      当一个构造函数前加上new的时候,背地里来做了四件事:
      1,生成一个空的对象并将其作为 this;
      2,将空对象的proto 指向构造函数;
      3,运行该构造函数;
      4,如果构造函数没有 return 或者 return 一个返回 this 值是基本类型,则返回
      this;如果 return 一个引用类型,则返回这个引用类型。
  • 此时的this:这时候,this被绑定到了新构造的对象上。

  • 举例子
    var People = function(name,age){
    this.name = name;
    this.age = age;
    };
    var p1 = new People('harrisking',23);
    p1.name;//harrisking;

  • apply调用模式

  • 定义:apply和call的方法很像,它拥有两个参数:一个是预设定的this,一个是要传递的参数(apply传递的是数组)。


分割线


敬爱的方方老师推荐的方法是:
将上述四种调用方式还原为call/apply形式。
则:

  • 方法调用模式:
    obj.foo( ) ==> obj.foo.call('obj');则this就是obj;
  • 函数调用模式:
    a() ==> window.a.call() ==> 因为call未指定this的值,则这里的this代表window;

最后特此感谢方方老师的原文 this的值到底是什么

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,385评论 2 17
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,744评论 0 38
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 6,380评论 1 10
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,462评论 0 4
  • 三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...
    梁同学de自言自语阅读 5,334评论 0 6