以前老是对this指向性问题搞混,记得不清楚。特意做一下笔记。正好整理自己思路。写的不一定对。如有错误希望指出 加以改正。
function sn(name, sex) { this.name = name; this.sex = sex; console.log(this); } sn();//提示windows var p1 = new sn(‘zs‘, ‘男‘);//提示sn{}
从这里可以看出 。构造函数的 this指向的是p1,也就是说谁调用指向谁。而直接使用sn()会指向windos。
function sn(name, sex) { this.name = name; this.sex = sex; console.log(this); } sn();//提示windows
函数调用this会指向全局对象windows,因为是windows调用了这个函数(包括匿名函数)。
var a = { name:"me", b:function () { console.log(this); } } a.b();//提示a{}
作为对象的方法调用this会指向a,也是谁调用就指向谁。
var a = { name:"me", b:function() { console.log(this); } }; var c = { name:"you" }; a.b();//输出a{} a.b.call(c); //输出c{} a.b.apply(c); //输出c{} a.b.bind(c)(); //输出c{}
这三个方法都是用来改变函数的this对象的指向的,他们第一个参数就是this指向的对象。
var a = { n1: function() { return function() { console.log(this); } }, n2: function() { return() => { console.log(this); } } }; var b = { name:"me" } var nativeFn = a.n1(); var arrowFn = a.n2(); nativeFn();//打印windows arrowFn();//打印a{} nativeFn.call(b);//打印b{} arrowFn.call(b);//打印a{}
通过上面例子可以看出箭头函数this的指向性是函数被创建时绑定的而不是调用的时候绑定,this的指向就是绑定时所在作用域并且不会因为被怎么调用而改变指向,并不会指向运行时所在的作用域
var a = { fn: function() { setTimeout(function() { console.log(this); }, 50) } } var b ={ jn: function() { that =this; setTimeout(function() { console.log(that); }, 50) } } a.fn();//打印windows b.jn();//打印b{}
如果没有特殊指向,定时器中的this指向windows,可以通过在外部函数中将this存为一个变量,回调函数中使用该变量,而不是直接使用this而改变this的指向。
原文:https://www.cnblogs.com/LiuLaoS/p/11974151.html