文章博客

技术团队文档示例


第六天: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: () =&gt; { 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的指向 =&gt; 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的指向 =&gt; 定义它的对象</h4> <pre><code>var obj = { a:1, print(){ setTimeout( () =&gt; { console.log(this.a); }, 1000 ); } }; obj.print();// 1 setTimeout箭头函数的this指的是定义它的对象,所以this指向的是obj对象,所以obj.a确实应该输出1。 ⚠️最后注意,我们前文一直都强调箭头函数没有 this,所以呢,我们不可以用 call()、apply()、bind() 这些方法去改变this的指向。</code></pre>

页面列表

ITEM_HTML