丸子学JS(学习30分钟 - this指向)

this的几种模式

  • 方法调用模式下,this总是指向调用它所在方法的对象,this的指向与所在方法的调用位置有关,而与方法的声明位置无关(箭头函数特殊)。
//声明位置
var fn=function(){
    console.log(this.x)
}    
var x="2"
var obj={
    x:"1",
    fn:fn
}
//调用位置
obj.fn();//1
//调用位置
fn(); //2
  • 函数调用下,this指向window,调用方法没有明确对象的时候,this指向window,,如setTimeout,匿名函数等。
var x="2"
//声明位置
var fn=function(){
    console.log(this.x)
}    
//调用位置
fn();//2
  • 构造函数调用模式下,this指向被构造的对象
 var flag=undefined;    
 function Fn(){
    flag=this;
 }    
 var obj=new Fn()
 console.log(flag==obj)
  • apply,call,bind调用模式下,this指向第一个参数。
var obj={
    name:'hty',
    getName:function(){
        console.log(this.name)
    }
}
var otherObj={
    name:'hml'
}
var name='upupup'
obj.getName()//hty
obj.getName.call();//upupup
obj.getName.call(otherObj);//hml
obj.getName.apply();//upupup
obj.getName.apply(otherObj);//hml
obj.getName.bind(this)();//upupup
obj.getName.bind(otherObj)();//hml
  • 箭头函数,在声明的时候绑定this,而非取决于调用位置,换句话说就是指向它的上一层。
//声明位置
var fn = (()=>{
    console.log(this.x)
})  
var x="2"
var obj={
    x:"1",
    fn:fn
}
//调用位置
obj.fn();//2
//调用位置
fn();//2
  • 严格模式下,如果this没有被执行环境(execution context)定义,那this是为undefined。
"use strict";
var fn=function(){
    return this
}    
fn() ==undefined;//true
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容