浅谈this 指向

222 阅读2分钟

谈到this,我们经常为之头疼,其实把规则捋清楚了!你会发现其实并没有想象的那么难!

常见场景

  1. 普通函数的this:指向它的调用者,如果没有调用者则默认指向window。
  2. 箭头函数的this: 指向箭头函数定义时所处的对象,而不是箭头函数使用时所在的对象,默认使用父级的this。
  3. this的指向在函数定义的时候是无法确定的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。
  4. 构造函数里面的 this 会绑定到我们 new 出来的这个对象上:默认绑定的指向。

关于权重

bind的权重比call和apply高!!

权重最高:new!

在浏览器和Node中的区别
在浏览器中,指向 window;在 Node 中,指向 Global。(严格模式下,指向 undefined)

在三种特殊情境下,this 会 100% 指向 window:
立即执行函数(IIFE)

补充形成IIFE的常见方法

  1. 函数不能直接加圆括号调用。
  2. 函数必须转为函数表达式才能被调用。
(function(){ alert(1); })();
!function(){ alert(1); }();
+function(){ alert(1); }();
-function(){ alert(1); }();
~function(){ alert(1); }();

setTimeout 中传入的函数
setInterval 中传入的函数

在严格模式下,this 将保持它被指定的那个对象的值,所以,如果没有指定对象,this 就是 undefined

call、apply、bind

改变函数的this指向

  1. 改变后直接进行函数调用 call apply
fn.call(target, arg1, arg2)
fn.apply(target, [arg1, arg2])
  1. call 和 apply 之间的区别,则体现在对入参的要求上。
    前者只需要将目标函数的入参逐个传入即可,后者则希望入参以数组形式被传入。
  2. 仅仅改变,不执行
 fn.bind(target, arg1, arg2 ) 

只是需要注意的是使用bind如果需要执行,需要加上调用


fn.bind(target, arg1, arg2 )()