【前端面试】this的指向

2024-01-18 21:24:27 浏览数 (1)

下面来看一道例题 a = { b:function(){ console.log(this); }, c:()=>{ console.log(this); } } 问: a.b a.c e= a.b f=a.c 主要是考察普通函数和匿名函数的this指向。下面来回顾一下this的指向。

一、this指向情况

this,函数的执行主体(不等价于执行上下文),取决于谁把这个函数执行的。

二、事件绑定中的this

给dom元素的某个事件行为绑定方法,当时间触发方法执行,方法中的this就是当前dom元素本身。

代码语言:javascript复制
document.body.onclick = function () {
	console.log(this)
}
document.body.addEventListener('click', function () {
	console.log(this)
})

注:IE6-IE8中基于attachEvent实现事件绑定,事件触发方法执行时,方法中的this不在元素本身,一般情况下都是指向window。

代码语言:javascript复制
/* document.body.attachEvent('onclick', function () {
	console.log(window)
	console.log(this)
}) */
三、普通函数执行中的this

1、函数执行,看函数前是否有“点”,有“点”,“点”前面是谁,this就指向谁,如果没有“点”,this就指向window(js严格模式下是undefined)

代码语言:javascript复制
function fn(){
   console.log(this);
}
fn(); //window

let obj={
  fn:function(){
    console.log(this);
  },
  fn1:{
    fn2:function(){
      console.log(this);
    }
  }
}
obj.fn(); //obj
obj.fn1.fn2(); //obj.fn2  

闭包中的this 一般都指向window

代码语言:javascript复制
let obj={
    fn:function(){
      return function(){
        console.log(this);
      }
    }
  }
obj.fn();

2、自执行函数执行,其内的 this 一般都是window,严格模式下为undefined

3、回调函数中的this为window或者undefined,除非做过特殊处理(如:数组的forEach方法·)

代码语言:javascript复制
[1,2,3].forEach(function(){
   console.log(this);	//window
 });

 //forEach对内部this进行处理
 [1,2,3].forEach(function(){
   console.log(this);	//{a:10}
 },{a:10})
四、箭头函数中的this

箭头函数中没有自己的this,所用到的this都是上下文中的this

箭头函数可以保留this的指向,因为它本身没有。

代码语言:javascript复制
let obj = {
	n: 1000,
	fn() {
		setTimeout(function () {
			// this ==> window
			console.log(this)
		}, 500)

		setTimeout(() => {
			// this 所处上下文中的this => obj
			console.log(this)
		}, 1000);
	}
}
obj.fn()
五、基于 call/apply/bind 强制改变中的 this

call/apply/bind 都可以强制改变this的指向 1、call和apply 都是立即执行函数,并且改变函数中的this,再并且给函数传递参数 call执行的函数,如果有参数,则以“,”方式一个个去添加 apply执行的函数,如果有参数,则以数组的方式来传递

代码语言:javascript复制
function fn(a,b){
   console.log(this);
   return a b;
 }
 fn(1,2);
 var o={a:100};
 
 fn.call(o,1,2);  //call
 fn.apply(o,[1,2]);	//apply

注意:在非严格模式下,第一个参数不传入或传入null或传入undefined,this都改变为window;严格模式下,不传是undefined,否则传入谁,this就改为谁。

2、bind并不会把函数立即执行,它是预先处理函数中的this和参数的 bind绑定的函数有参数,和call中的参数传递一样 bind方法在react中大量使用

代码语言:javascript复制
 var obj = {
      id: 1,
      name: '张三'
    }

    function fn(a, b) {
      console.log(this, a, b)
    }

    document.querySelector('#box').onclick = fn.bind(obj,1,2)

0 人点赞