js中this的用法总结

this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁

this的小案例

  1. 在函数内部定义的变量, 不加var声明, 会变成全局变量, 添加到window对象
function userTest() {
    user = 'mike';
    console.log(1,this.user);
    console.log(2,this);
}
userTest()
//1 mike
//2 window
复制代码
  1. 在函数内部定义的变量, 加var声明, 会变成局部变量, 仅在局部有效
function userTest() {
    var user = 'mike';
    console.log(1,this.user);
    console.log(2,this);
}
userTest()
//1 undefined
//2 window
复制代码

直接调用userTest() 相当于 window.userTest(), 那么this的指向就是window

此时注意一个坑,如果内部变量声明用name,结果会不一样,因为window有个属性叫name。。。 所以这时this.name 是空字符串

function userTest() {
    var name = 'mike';
    console.log(1,this.name); //1 ""
    console.log(2,this); //2 window
}
userTest()
复制代码
  1. 在对象中用this
var obj = {
  user:'mike',
  fn:function(){
    console.log(1,this.user) // 1 mike
    console.log(2,this) // 2 obj
  }
}
obj.fn()
复制代码

还有第二种,看箭头函数

var obj = {
  user:'mike',
  fn:() => {
    console.log(1,this.user) // 1 undefined
    console.log(2,this); // 2 window
  }
}
obj.fn()
复制代码

此时引出普通函数和箭头函数的区别,箭头函数不绑定this(普通函数绑定this),会捕获其所在的上下文的this值,作为自己的this值。可以使用闭包绑定this。

var obj = {
  user:'mike',
  fn: function() {
    return () => {
      console.log(1,this.user) // 1 mike
      console.log(2,this) // 2 obj
    }
  }
}
obj.fn()()
复制代码
  1. 作为构造函数调用(相当于普通函数调用了)
//不使用new指向window
var name = 'hello'
function Person (name) {
    console.log(this) // window
    console.log(this.name) // hello
    this.name = name;
    console.log(this.name) // mike
}
Person('mike')
复制代码
//使用new,this指代new出的对象
var name = 'hello'
function User(){
  this.name = 'mike'
  console.log(this)  // User
  self = this
}
console.log(self) // window
console.log(self.name) // hello
var user = new User()
console.log(user.name) // mike
复制代码

转载于:https://juejin.im/post/5b90817df265da0a91452056

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值