一、全局执行
在全局作用域中 this 指向当前的全局对象 Window
非严格模式中
12345function func () {console.log(this);}func();// Window严格模式中
123456;function func () {console.log(this);}func();// undefined
三、作为对象的方法调用
当一个函数被当作一个对象的方法调用的时候,this 指向当前的对象 obj:
如果把对象的方法赋值给一个变量,调用该方法时,this 指向 Window:
四、作为一个构造函数使用
在 JS 中,为了实现类,我们需要定义一些构造函数,在调用一个构造函数的时候加上 new 这个关键字:
此时,this 指向这个构造函数调用的时候实例化出来的对象。当然了,构造函数其实也是一个函数,若将构造函数当做普通函数来调用,this 指向 Window:
五、在定时器中使用
如果没有特殊指向(指向更改请看下方:怎么改变 this 的指向),setInterval 和setTimeout 的回调函数中 this 的指向都是 Window 。这是因为 JS 的定时器方法是定义在 Window 下的。
|
|
六、箭头函数
在全局环境中调用:
12345var func = () => {console.log(this);}func();// Window作为对象的一个函数调用:
12345678var obj = {name: 'hh',func: function () {console.log(this);}}obj.func();// obj
不难发现,普通函数作为对象的一个函数被调用,this 指向 obj。
箭头函数作为对象的一个函数被调用时,若箭头函数直接作为对象的某个方法被调用,this 指向 Window。
若箭头函数在某方法的内部,this 指向箭头函数外部非箭头函数 this 的值;在上述示例中,this 指向 obj。
- 特殊情况
结合定时器调用:12345678910var obj = {name: 'hh',func: function () {setTimeout(function () {console.log(this);}, 0)}}obj.func();// Window
|
|
若在对象的函数中,普通函数作为定时器延时执行的函数调用,this 指向 Window;箭头函数作为定时器延时执行的函数调用, this 指向定义时所在的对象,也就是 func 中的 this,即 obj。
七、call、apply、bind
call:
它会立即执行函数,第一个参数是指定执行函数中 this 的上下文,后面的参数是执行函数需要传入的参数;
apply:
它也会立即执行函数,第一个参数是指定执行函数中 this 的上下文,第二个参数是一个数组,是传给执行函数的参数(与 call 的区别);
bind:
它不会执行函数,而是返回一个新的函数,这个新的函数被指定了 this 的上下文,后面的参数是执行函数需要传入的参数;我们来看个示例:
在这个示例中,call、apply 和 bind 的 this 都指向了 obj,都能正常运行;call、apply 会立即执行函数,call 和 apply 的区别就在于传递的参数,call 接收多个参数列表,apply 接收一个包含多个参数的数组;bind 不是立即执行函数,它返回一个函数,需要执行 p2 才能返回结果,bind 接收多个参数列表。