this指向及箭头函数

this 指向问题:一般情况下this的最终指向的是那个调用它的对象。

1、全局作用域或者普通函数中this指向全局对象window( 注意定时器里面的this指向window)

// 全局作用域或者普通函数中this指向全局对象window( 注意定时器里面的this指向window)
console.log(this);  //window

function fn() {
	console.log(this);  //window
}
window.fn();
window.setTimeout(function() {
	console.log(this);  //window
}, 1000);

2、方法调用中谁调用,则this指向谁

// 方法调用中谁调用this指向谁
var o = {
	sayHi: function() {
    	console.log(this); // this指向的是 o 这个对象
	}
}
o.sayHi();

var btn = document.querySelector('button');
btn.onclick = function() {
	console.log(this); // this指向的是btn这个按钮对象
}

btn.addEventListener('click', function() {
	console.log(this); // this指向的是btn这个按钮对象
})

3、构造函数中this指向构造函数的实例

// 构造函数中this指向构造函数的实例
function Fun() {
	console.log(this); // this 指向的是fun 实例对象
}
var fun = new Fun();

ES6中的箭头函数:
const ccc = (参数列表) => { }
const ccc = () => { }

1.参数问题:

// 1.1.放入两个及以上参数
const sum = (num1, num2) => {
  return num1 + num2
}

// 1.2.放入一个参数,可以省略括号
// const power = (num) => { }
const power = num => {
  return num * num
}

// 1.3.没有参数,括号不能省略
const show = () => {
  console.log('Hello');
}

2.函数内代码量问题:

//2.1.函数代码块中有多行代码时
const test = () => {
  // 1.打印Hello World
  console.log('Hello World');
  // 2.打印Hello Vuejs
  console.log('Hello Vuejs');
}
// 2.2.函数代码块中只有一行代码
// const mul = (num1, num2) => {
//   return num1 + num2
// }
const mul = (num1, num2) => num1 * num2 // 这种写法,不用写return,因为它有返回值返回
// 因此引申出另一种情况:原代码中没有return的情况
// const demo = () => {
//   console.log('Hello Demo'); // 没有return
// }
const demo = () => console.log('Hello Demo')
console.log(demo()); // Hello Demo  undefined
// 调用demo()时,会打印 Hello Demo
// 箭头函数这种写法会有返回值,但是log是没有返回值的,所以返回给demo()函数的是undefined
// 最终打印demo()时会打印出 Hello Demo  undefined

3.箭头函数的this指向问题:
问题:箭头函数中的this是如何查找的了?
答案:向外层作用域一层层地查找this,直到有this的定义。

setTimeout(function () {
  console.log(this);  // window
}, 1000)
  
setTimeout(() => {
  console.log(this);  // window
}, 1000)
const obj = {
  aaa() {
	setTimeout(function () {
      console.log(this); // window
    })
    
    setTimeout(() => {
      console.log(this); // obj对象,aaa()函数作用域中,this指向的是obj
    })

	console.log(this); // obj
  }
}

测试:

const obj = {
  aaa() {
	setTimeout(function () {
	  console.log(this) // window
      setTimeout(function () {
        console.log(this); // window
      })
	  setTimeout(() => {
        console.log(this); // window
      })
    })

    setTimeout(() => {
      console.log(this); // obj
      setTimeout(function () {
        console.log(this); // window
      })
	  setTimeout(() => {
        console.log(this); // obj
      })
    })
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值