美文网首页
this指向全解

this指向全解

作者: 是素净呀丶 | 来源:发表于2020-03-10 16:01 被阅读0次

结论:函数中this总是指向调用它的对象(箭头函数除外、特殊情况除外)。

  1. 对象字面量。
var name = "win"
var p = {
  name: "p",

  fn1: function() {
    console.log(this.name);

    return function() {
      console.log(this.name);
    }
  },

  fn2: function() {
    console.log(this.name);
    
    return () => {
      console.log(this.name);
    }
  },

  fn3: () => {
    console.log(this.name);

    return () => {
      console.log(this.name);
    }
  }
};

p.fn1()()  // p win
p.fn2()()  // p p
p.fn3()()  // win win

箭头函数内的this向上指向,直到遇上非箭头函数内this,此处可理解为css中绝对定位向上查找父级。

  1. call改变this指向。
var name = "win"
var p = {
  name: "p",

  fn1: function() {
    console.log(this.name);

    return function() {
      console.log(this.name);
    }
  },

  fn2: function() {
    console.log(this.name);
    
    return () => {
      console.log(this.name);
    }
  },

  fn3: () => {
    console.log(this.name);

    return () => {
      console.log(this.name);
    }
  }
};
var p2 = { name: "p2" };

p.fn1.call(p2)();  // p2 win
p.fn1().call(p2);  // p  p2
p.fn2.call(p2)();  // p2 p2
p.fn2().call(p2);  // p  p
p.fn3.call(p2)();  // win win
p.fn3().call(p2);  // win win

call对箭头函数内的this是无效的,但可通过改变其向上指向的this(其父级)来改变。

  1. 构造函数。
var name = "win";
var P = function(name) {
  this.name = name;
  this.fn = () => {
    console.log(this.name);
  };
  this.fn2 = function() {
    console.log(this.name);

    return () => {
      console.log(this.name);
    };
  }
};

P.prototype = {
  fn3: () => {
    console.log(this.name);
  }
};

var p = new P("p");
p.fn();     // p
p.fn2()();  // p p
p.fn3();    // win
  • 在构造函数内,即使使用箭头函数,其内this也指向正确。
  • 原型上使用箭头函数会导致this指向错误。
  1. 复合例子。
var name = "win"
var p = {
  name: "p",

  o: {
    name: "o",
    fn: function() {
      console.log(this.name);

      return () => {
        console.log(this.name);
      }
    },

    fn2: () => {
      console.log(this.name);

      return () => {
        console.log(this.name);
      }
    },

    fn3: () => {
      console.log(this.name);
      
      return function() {
        console.log(this.name);
      }
    }
  }
};

p.o.fn()();         // o o
p.o.fn2()();        // win win
p.o.fn3()();        // win win
p.o.fn.call(p)();   // p p
p.o.fn2.call(p)();  // win win
p.o.fn3.call(p)();  // win win
p.o.fn().call(p);   // o o
p.o.fn2().call(p);  // win win
p.o.fn3().call(p);  // win o
  1. 特殊情况。
var name = "win";
var p = {
  name: "p",
  fn: function() {
    console.log(this.name);

   return () => {
     console.log(this.name);
   }
  }
}

function fn(f) {
  f && f()
}

fn(p.fn)          // win
fn(p.fn.bind(p))  // p

// fn(p.fn)可看作如下转化
var fn2 = p.fn;
fn(fn2);

// 值得注意的是箭头函数this指向的是该函数定义时确定的this,与调用它时的对象无关
fn(p.fn()); // p p

总结:

  • 箭头函数通俗的理解为其父级this指向,定义时
  • 一般函数this指向调用其的对象。
  • 函数被当作其他函数参数时,应理解为有中间变量将函数独立出来,以函数的归属对象无关。

相关文章

  • this指向全解

    结论:函数中this总是指向调用它的对象(箭头函数除外、特殊情况除外)。 对象字面量。 箭头函数内的this向上指...

  • 淘宝刷单

    淘宝刷单全解 淘宝刷单对于消费者而言,或许就是购买的指向标。但是对于一个店铺,那就是必不可少...

  • less全知全解

    一.简介 1.less是什么Less 是一门 一种动态样式语言,它扩充了 CSS 语言,增加了诸如变量、混合(mi...

  • 易经全解

    一:以自我为中心的人,将困于人生最大的陷阱 人人都有“自我”——身体、思想、财产、名誉、地位等等。如果你是一个聪明...

  • docker全解

    基本概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发...

  • Broadcast全解

    Android系统的app可以从系统或者其他app发送或者接受广播消息。类似于(发布-订阅模式)。 app可以注册...

  • annotation 全解

  • UILabel全解

    设置label中placeHolder的字体大小和颜色 nvm use --delete-prefix iojs-...

  • UICollectionView 全解

    什么是UICollectionView? UICollectionView是一种新的数据展示方式,简单来说可以把他...

  • icon 全解

    icon 的各种做法 img 法 background 法 background 合一法 font 法 SVG 法...

网友评论

      本文标题:this指向全解

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