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