第六天:this的指向问题
<h5>this的指向问题</h5>
<h5>主要思路:this的指向是在函数调用时确定的。也就是执行上下文被创建时确定的。</h5>
<h4>1.普通函数this指向</h4>
<pre><code>var name = "jay";
var person = {
name: "kang",
pro: {
name: "Michael",
getName: function() {
return this.name;
}
}
};
console.log(person.pro.getName()); //'Michael'
var pepole = person.pro.getName;
console.log(pepole()); //'jay'
//解题思路:
//person.pro.getName()中,getName是调用者,他不是独立调用,被对象person.pro所拥有,因此它的this指向了person.pro。(2)而pepole()作为调用者,尽管他与person.pro.getName的引用相同,但是它是独立调用的,因此this指向undefined,在非严格模式,自动转向全局window。</code></pre>
<p>相关文章链接 <a href="https://juejin.im/entry/58b4c65344d90400685c2bdf">https://juejin.im/entry/58b4c65344d90400685c2bdf</a>
自己文章链接:<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/c5a89cf6ea391bee1109510eaa7b380b?showdoc=.jpg" alt="" /></p>
<h6>this的指向问题二:</h6>
<h5>对象中this的指向问题(无箭头函数)这一点要特别注意,也是面试的时候面试官最关注的。 箭头函数的this指向的是父级作用域的this,是通过查找作用域链来确定 this 的值也就是说,看的是上下文的this,指向的是定义它的对象,而不是使用时所在的对象;普通函数指向的是它的直接调用者。</h5>
<h4>2.箭头函数的this</h4>
<pre><code>let obj = {
a: 1,
b: () => {
console.log(this.a); // undefined
},
c: function() {
console.log(this.a); // 1
},
};
obj.b(); // undefined
obj.c(); // 1
obj.b() 箭头函数是没有this的,他的this继承来的,默认指向宿主对象,而不是执行他的对象,所以this指向window上面没有a,所以返回undefined。
obj.a() 普通函数的this指向直接//调用者 ,所以为obj,所以obj.a指向1</code></pre>
<p>例如二:setTimeout()中的this的问题</p>
<h4>3.setTimeout()中普通函数的this的指向 => window</h4>
<pre><code>var obj = {
a:1,
print(){
setTimeout(
function(){console.log(this.a);},
1000
);
}
};
obj.print();//undefined
定时器中的函数由于没有默认宿主对象,setTimeout中的function未被任何对象调用,它的this指向默认是window对象,自然输出undefined。</code></pre>
<h4>4.setTimeout()中箭头函数this的指向 => 定义它的对象</h4>
<pre><code>var obj = {
a:1,
print(){
setTimeout(
() => { console.log(this.a); },
1000
);
}
};
obj.print();// 1
setTimeout箭头函数的this指的是定义它的对象,所以this指向的是obj对象,所以obj.a确实应该输出1。 ⚠️最后注意,我们前文一直都强调箭头函数没有 this,所以呢,我们不可以用 call()、apply()、bind() 这些方法去改变this的指向。</code></pre>