一点关于this的理解

2018-09-15  本文已影响8人  秃头成就技术

关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:knockout,有时候不明白为什么不直接使用this,而要把 this 作为参数传入。

1. 不像C#,this一定是指向当前对象。js的this指向是不确定的,也就是说是可以动态改变的。call/apply 就是用于改变this指向的函数,这样设计可以让代码更加灵活,复用性更高。

2. this 一般情况下,都是指向函数的拥有者。这一点很重要!这一点很重要!这一点很重要!


这也是一道常见的面试题,如下代码:

       var obj = {

   number: 2,

  showNumber: function(){

  this.number =3;

  (function(){

  console.log(this.number);

  })();

  console.log(this.number);

  }

  };

  obj.showNumber();

第一个打印window.number

第二个打印obj.number


由于showNumber方法的拥有者是obj,所以this.number=3; this 指向的就是 obj 的属性 number。同理,第二个 console.log 打印的也是属性 number。

为什么一般情况下this都是指向函数的拥有者,因为有特殊情况。函数自执行就是特殊情况,在函数自执行里,this 指向的是:window。所以第一个 console.log 打印的是 window 的属性 number。

所以要加一点:

3. 在函数自执行里,this 指向的是 window 对象。

扩展,关于this,还有一个地方比较让人模糊的是在 dom 事件里,通常有如下3种情况:

如下:

1. 使用标签属性注册事件,此时this 指向的是 window 对象。

function test(){alert(this)}


2. 对于1,要让 this 指向 input,可以将 this 作为参数传递。


3. 使用 addEventListener 等注册。此时this 也是指向 input。

document.getElementById("test").addEventListener("click",test);

4.this在被apply和call方法改变指向为null时,this代表window

****转载

上一篇 下一篇

猜你喜欢

热点阅读