js this工作原理

js中的this是个很妙的东西,你经常不知道它到底在指向谁,又是谁在调用它。

 

通用判断方法:

1.this总是指向它的直接调用者

var a={
user:'Artimis',
fn:function(){
 console.log(this.user)
}
}

a.fn()  //Artimis => this指向a

var b=a.fn;
b()   //undefined => this指向window

 2.如果没有找到直接调用者,则this指向window

function fn(){
var user='Artimis';
console.log(this.user)
}
fn()   //undefined => this指向window

3.遇到return,如果返回的是对象,则this指向返回对象,否则指向函数实例

function A(){
this.user='Artimis';
return {}   //return一个空对象
}

var a=new A();
console.log(a.user)  //undefined => this指向return的{}


function B(){
this.user='Artimis';
return 1   //return一个数值
}

var b=new B();
console.log(b.user)  //Artimis => this指向b

 

4.使用call/apply/bind绑定的,this指向绑定对象

5.定时器(匿名函数)内没有默认的宿主对象,所以this指向window

6.箭头函数内部没有this,this指向外层最近的调用者

   1> 箭头函数在调用时,不会生成自身作用域下的this和arguments

   2> 不像普通函数一样在调用时自动获取this,而是沿着作用域链向上查找,找到最近的外部一层作用域的this,并获取

   3> 在定义对象的方法/具有动态上下文的回调函数/构造函数中都不适用

 

改变this指针指向:

1.new操作符

new会创造一个对象实例,这个实例继承了new操作符右边的对象,因此在调用方法时,this会指向对象实例

function A(){
 this.user='Artimis'
}
var a=new A();
console.log(a.user)  //Artimis => this指向a

2.call/apply/bind

 call和apply主要用于指定this的环境变量,第一个参数是什么,this就指向什么,如果是null,则指向window 

var a={
    user:'Artimis',
    fn:function(){
      console.log(this.user)  
   }
}    
var b=a.fn;
b() //undefined b.call(a)
//Artimis => this指向a b.call(null) //undefined => this指向window

bind是延迟的,会返回一个修改后的函数,可以自行决定执行的时间

var a={
    user:'Artimis',
    fn:function(){
      console.log(this.user)  
   }
}    
var b=a.fn;
var c=b.bind(a)
c()   //Artimis => 延迟执行,自定义执行时间
var a={
  fn:function(x,y){
    console.log(x+y)  
 }
}

var b=a.fn;
var c=b.bind(a,2)  //自定义参数x 
c(3)  //5

 

转载于:https://www.cnblogs.com/artimis/p/9004134.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值