js基础之this的情况汇总

101 阅读2分钟

判断this一定不要看在哪里定义。一定只看将来在哪里,如何被调用。

一:obj.fun() this指向“.”前的obj对象。

二:new构造函数() this指向new正在创建的新对象

三:构造函数.prototype.fun=function(){}this指向将来调用这个fun函数的“.”前的某个子对象

四: fun()、匿名函数自调和回调函数中的 this指向window。(严格模式(usestrict)下,this指向undefined)

比如:

(function(){ … this …})();
arr.forEach( function(){ … this … } );

五:DOM事件处理函数里的this->当前正在出发事件的.前的DOM元素对象。

比如:

button.onclick=function(){}
或
button.addEventListener(“click”,function(){…})

注意:这里不能改成箭头函数!一旦改为箭头函数,this指外层的window。功能就会出错。

六:Vue中this默认都指当前vue对象。

export default{
    methods:{
    //vue中methods中的方法中的this默认都指当前vue组件对象
    fun(e){ e.target }
    //如果想获得当前出发事件的DOM元素对象,必须用$event关键字和e.target联合使用
    }
}

七: 箭头函数中的this指向当前函数之外最近的作用域中的this。

箭头函数的特性: 箭头函数可让函数内的this与函数外的this保持一致!
而箭头函数内的局部变量,依然只能在箭头函数内使用。出了箭头函数不能用!所以,箭头函数依然是作用域!只不过影响this而已!不影响局部变量。 箭头函数底层原理: 相当于.bind()永久绑定外部this!( call无法替换箭头函数中this)

八:可用call或apply,临时替换一次函数中的this;可用bind,永久替换函数中的this

(1)一次调用函数时,临时替换一次this:

要调用的函数.call(替换this的对象, 实参值1,...)
call或apply做三件事:

  1. 立刻调用一次.前的函数
  2. 自动将.前的函数中的this替换为指定的新对象
  3. 向要调用的函数中传实参值(如果是apply先拆散数组为多个元素值,再分别传给函数的形参变量)

(2)创建函数副本并永久绑定this

var 新函数=原函数.bind(替换this的对象)
bind做三件事:

  1. 创建一个和原函数一模一样的新函数副本
  2. 永久替换新函数中的this为指定对象
  3. 永久替换部分形参变量为固定的实参值 强调: 被bind()永久绑定的this,即使用call,也无法再替换为其它对象了。——箭头函数的底层原理