this的幾種模式
- 方法調(diào)用模式下晃虫,this總是指向調(diào)用它所在方法的對(duì)象禽翼,this的指向與所在方法的調(diào)用位置有關(guān)膳算,而與方法的聲明位置無關(guān)(箭頭函數(shù)特殊)肥败。
//聲明位置
var fn=function(){
console.log(this.x)
}
var x="2"
var obj={
x:"1",
fn:fn
}
//調(diào)用位置
obj.fn();//1
//調(diào)用位置
fn(); //2
- 函數(shù)調(diào)用下趾浅,this指向window,調(diào)用方法沒有明確對(duì)象的時(shí)候,this指向window,馒稍,如setTimeout,匿名函數(shù)等皿哨。
var x="2"
//聲明位置
var fn=function(){
console.log(this.x)
}
//調(diào)用位置
fn();//2
- 構(gòu)造函數(shù)調(diào)用模式下,this指向被構(gòu)造的對(duì)象
var flag=undefined;
function Fn(){
flag=this;
}
var obj=new Fn()
console.log(flag==obj)
- apply,call,bind調(diào)用模式下纽谒,this指向第一個(gè)參數(shù)证膨。
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
- 箭頭函數(shù),在聲明的時(shí)候綁定this鼓黔,而非取決于調(diào)用位置央勒,換句話說就是指向它的上一層。
//聲明位置
var fn = (()=>{
console.log(this.x)
})
var x="2"
var obj={
x:"1",
fn:fn
}
//調(diào)用位置
obj.fn();//2
//調(diào)用位置
fn();//2
- 嚴(yán)格模式下澳化,如果this沒有被執(zhí)行環(huán)境(execution context)定義崔步,那this是為undefined。
"use strict";
var fn=function(){
return this
}
fn() ==undefined;//true