js 中的this指向问题?

一、常规函数

1、对象函数:谁调用的this指向谁
obj.getName() //指向obj
var name = '劝退师';
var obj = {
   name: '程序员劝退师',
   getName: function() {
      console.log(this.name); 
   },
};
obj.getName();  //程序员劝退师

2、普通函数:没有调用就是指向window
getName();  //非严格模式下,指向window,严格模式下为undefined
var name = '程序员劝退师';
function getName() {
   console.log(this.name);
};
getName(); // 程序员劝退师

3、构造函数:this指向本身

指向var obj = new Obj(); obj();//指向Obj本身
var Obj = function() {
   this.name = '程序员劝退师';
};

var obj = new Obj();
console.log(obj.name);

var obj1 = new Obj();
obj1.name = '劝退师';
console.log(obj1.name);
4、通过call,apply,bind改变this指向,指向传入函数的this:
getName().apply(obj); getname.call(obj);//指向obj
 
var arg = '程序员劝退师';
var obj = {
   arg: '劝退师',
   fn: function() {
      console.log(this.arg);
   },
};
obj.fn();            // 劝退师
obj.fn.call(window); //程序员劝退师 

var obj1 = { arg: '劝退师1' };
var obj2 = { arg: '劝退师2' };
obj.fn.call(obj1);   //劝退师1
obj.fn.apply(obj2);  //劝退师2

二、箭头函数

箭头函数的this指向它外层定义的函数,如果没有就指向window(因为对象不能单独形成作用域);

案例

var obj = { name: '程序员劝退师', getName: () => console.log(this.name) };
obj.getName(); //undefined  定义的时候外层没有函数,指向window

var obj1 = {
   name: '程序员劝退师',
   getName: function() {
      print = () => console.log(this.name);
      print();
   },
};
obj1.getName(); //程序员劝退师  定义的时候外层函数的this就是箭头函数的this

 

posted @ 2021-02-02 22:17  程序員劝退师  阅读(65)  评论(0编辑  收藏  举报