说一下 this 的指向

普通函数的this

作为函数在全局调用,this的指向是window

var name = '卡卡';
    function cat() {
      var name = '有鱼';
      console.log(this.name);//卡卡
      console.log(this);//window
    }
    cat();

作为对象中的某个方法被调用,this指向该对象

一层作用域链

复制代码
    var name = '卡卡';
    var cat = {
      name: '有鱼',
      eat: function () {
        console.log(this.name); // 因为函数eat是由cat对象调用的,所以this指向的是cat本身,所以cat.name=有鱼;
        console.log(this);//{name: '有鱼', eat: ƒ}
      }
    }
    cat.eat();
复制代码

多层作用域链时,this指向最近的

复制代码
var name = '卡卡';
    var cat = {
      name: '有鱼',
      eat1: {
        name: '年年',
        eat2: function () {
          console.log(this.name);//年年
          console.log(this);//{name: '年年', eat2: ƒ}
        }
      }
    }
    cat.eat1.eat2();
复制代码

构造函数的调用,this指向实例化新对象

 var name = '卡卡';
    function Cat(name) {
      this.name = name;
      console.log(this)
    }
    var cat1 = new Cat('有鱼');//Cat {name: '有鱼'}
    console.log(cat1.name);// 有鱼

匿名函数的调用,this指向全局对象

var name = '卡卡';
var cat = {
  name:'有鱼',
  eat:(function(){
    console.log(this.name);//卡卡
  })()
}
cat.eat;

 箭头函数的this

全局函数下

  const global = () => {
      console.log(this);//Window
    }
    global();

对象方法中

定义箭头函数的作用域的this指向谁,箭头函数的this就指向谁

    const Person = {
      realname: '张三',
      age: 19,
      say: () => {
        console.log(this);//Window 
      }
    }
    Person.say();//window

构造函数中

指向当前实例,就是新建对象本身,箭头函数this一旦定义就不能改变

复制代码
    function Person(realname, age) {
      this.realname = realname;
      this.age = age;
      this.say = () => {
        console.log(this);
      }
      this.say1 = function () {
        console.log(this);
      }
    }
    const P1 = new Person('张三', 19);
    const P2 = new Person('李四', 20);
    P1.say();  //Person {realname: "张三", age: 19, say: ƒ, say1: ƒ}
    P2.say();  //Person {realname: "李四", age: 20, say: ƒ, say1: ƒ}
    P1.say.call(P2);//Person {realname: "张三", age: 19, say: ƒ, say1: ƒ}
    P1.say1.call(P2);//Person {realname: "李四", age: 20, say: ƒ, say1: ƒ}
复制代码

 箭头函数相较于普通函数

  • 箭头函数都是匿名函数,普通函数有匿名也有具体名函数
  • 箭头函数不能用于构造函数,不能new
  • 箭头函数this永远指向其上下文this,任何方法改变不了其指向
posted @   天青色等烟雨灬  阅读(25)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示