美文网首页
this绑定方式与优先级

this绑定方式与优先级

作者: 患者_ | 来源:发表于2021-10-11 15:38 被阅读0次

四种this绑定

这四种绑定分类是基于调用点(call site),即函数是在哪里被谁调用的。也就是说this指向谁,跟函数在哪里定义没有关系,而是取决于被谁调用。下面我们具体分析每种绑定情况。

默认绑定与隐式绑定

让我们看看下面这个例子:

function foo() { 
    console.log(this.bar); 
} 
var bar = "bar1"; 
var o2 = {bar: "bar2", foo: foo}; 
var o3 = {bar: "bar3", foo: foo}; 
foo();            // "bar1" – 默认绑定
o2.foo();          // "bar2" – 隐式绑定
o3.foo();          // "bar3" – 隐式绑定

foo()这种调用方法,就是默认绑定。如果在非严格模式下,this就是全局对象,浏览器当中就是window。而如果在严格模式(use strict)下,this就会是undefined。

之所以这是默认绑定,因为foo的调用不属于任何人,前面没有任何限定条件。这是最简单的绑定。

o2.foo()和o3.foo()这两种调用方法,都是隐式绑定。Foo是作为o2和o3的方法而调用的,那么谁调用foo,this就指向谁。在上面的例子中,o2.foo()中的this指向o2,因此this.bar就是o2当中的bar: “bar2”;同理,o3.foo()打印出来的就是o3中的”bar3”。

显式绑定

我们看一个显式绑定的例子:

function foo() { 
console.log(this.bar); 
} 
var bar = "bar1"; 
var obj = {bar: "bar2"}; 

foo();          // "bar1"   默认绑定
foo.call(obj);     // "bar2"  显式绑定,使用obj作为"this" 

如果foo是通过call、apply或者bind调用的,那么这种调用就是显式绑定。这种绑定中,this的指向就是这三个函数中传递的第一个参数。

关键字new绑定

请看下面这个例子:

function foo() { 
    this.baz = "baz"; 
    console.log(this.bar + " " + baz); 
} 
var bar = "bar"; 
var baz = new foo(); 

如果把new这个关键字放在一个函数调用的前面,JS编译器会做这四件事情:

  1. 创建一个新的空的对象
  2. 把这个对象链接到原型对象上
  3. 这个对象被绑定为this
  4. 如果这个函数不返回任何东西,那么就会默认return this

关于new这个关键字的四步,看不懂也没事,有空的话会另写一篇文章具体介绍一下。不过,我们从这四步可以看出,如果在函数调用前面加上new,那么这个函数中的this就是这个新的对象。

上面的例子,最终会输出undefined undefined。这是因为baz这个变量并没有bar这个属性,而baz此时只被定义,没有被赋值,因此baz也是undefined。

箭头函数

箭头函数会无视以上所有的规则,this的值就是函数创建时候所在的lexical scope中的this,而和调用方式无关。可以对比下面两个例子:

function Person(){
  this.age = 0;
  setTimeout(function () {
    console.log(this.age);     // 输出undefined
  }, 1000);
}
var p = new Person();
function Person(){
  this.age = 10;
  setTimeout(()=> {
    console.log(this.age);     // 输出10
  }, 1000);
}
var p = new Person();

在上面没有使用箭头函数的例子当中,setTimeout内部的函数是被global调用的,而global没有age这个属性,因此输出undefined。

第二个例子使用了箭头函数,this就会使用lexical scope中的this,就是Person,因此输出10。

绑定优先级

如果多重绑定规格都适用,那么绑定规则的优先级顺序是这样的:

  1. 箭头函数
  2. 关键字new调
  3. 显式绑定
  4. 隐式绑定
  5. 默认绑定

箭头函数优先级最高,会无视2-5绑定规则。而默认绑定优先级最低,只有其他绑定都不使用的时候,才会使用默认绑定。

好啦,这就是关于this的一切。希望看完这篇文章之后,你能够回答开头提出的那两个问题了。祝大家前端学习一切顺利。

相关文章

  • this绑定方式与优先级

    四种this绑定 这四种绑定分类是基于调用点(call site),即函数是在哪里被谁调用的。也就是说this指向...

  • js -> this

    优先级: new绑定 > 显式绑定 > 隐式绑定 > 默认绑定 1、 默认绑定 2、 隐式绑定(格式: xxx.f...

  • LOOK ! SpringBoot的外部化配置最全解析

    本篇要点 介绍各种配置方式的优先级。 介绍各种外部化配置方式。 介绍yaml的格式及原理。 介绍如何绑定并测试类型...

  • this对象

    绑定规则: 默认绑定 隐式绑定 显示绑定 new绑定 判断this 现在我们可以根据优先级来判断函数在某个调用位置...

  • JS this机制

    目录 this 是什么 this 的四种绑定规则 绑定规则的优先级 绑定例外 扩展:箭头函数 this 是什么 理...

  • js中的this详细介绍

    目录this 是什么this 的四种绑定规则绑定规则的优先级绑定例外扩展:箭头函数this 是什么理解this之前...

  • RN中的this机制

    一 :四种绑定规则 优先级由高到低顺序1:new 绑定 2:显示绑定通过call apply bind实现 3:隐...

  • 面试总结

    this优先级: new绑定(使用new来调用函数)>显式绑定(核心是JavaScript内置的call()和ap...

  • 性能优化概述

    cpu 1、应用层 编译器优化, 算法优化, 异步处理, 善用缓存 2、底层 cpu绑定与cpu独占, 优先级调整...

  • 判断this

    根据优先级来判断this绑定的哪个对象1.函数是否在new中调用(new 绑定)?如果是的话this绑定的是新创建...

网友评论

      本文标题:this绑定方式与优先级

      本文链接:https://www.haomeiwen.com/subject/yufilltx.html