JavaScript this的指向問題
this的指向
在函數創建的時候,this的指向還未確定,它最終指向調用它的對象
window.onload=function(){
window.a="我的曾經"
function da(){
console.log(this.a)
}
da() //我的曾經
}
解:window對da()函數進行調用,故this指向window
window.onload=function(){
window.a="我的曾經"
var bn={
a:"小白",
da:function(){
console.log(this.a)
}
}
bn.da() //小白
}
解:bn對象對da()函數進行調用,故this指向window
window.onload=function(){
window.a="我的曾經"
var a="小白"
var bn={
a:"大白",
da:{
//a:"打包",
b:function(){
console.log(this.a)
}
}
}
bn.da.b() //undefined
}
解:da對象調用b()函數,故this指向da
window.onload=function(){
window.a="我的曾經"
var a="小白"
var bn={
a:"小白",
da:{
a:"打包",
b:function(){
console.log(this.a)
}
}
}
var hk=bn.da.b
hk() //我的曾經
}
解:var hk=bn.da.b這句話,將b()函數賦值hk,所以它調用的是window.hk(),故this指向window
構造函數的this指向
function this(){ this.user = "呵呵噠"; } var a = new this(); console.log(a.user); //呵呵噠
解:new關鍵字就是創建一個對象實例,所以a是個對象,所以函數this()被對象a調用,那麽this指向的自然是對象a,對象a中會有user,是因為new關鍵字於復制了一份this()函數
function fu(){
this.user = "武器";
return {};
}
var a = new fu;
console.log(a.user); //undefined
function fu(){
this.name="大叔";
return 25;
}
var a=new fu;
console.log(a.name) //大叔
解:如果返回值是一個對象,那麽this指向的就是那個返回的對象,如果返回值不是一個對象那麽this還是指向函數的實例,如果return null,雖然null也是對象,但是在這裏this還是指向那個函數的實例
call()
var a = {
user:"hhh",
fn:function(a,b){
console.log(this.user); //hhh
console.log(a+b); //8
}
}
var b = a.fn;
b.call(a,3,5);
解:call() 方法,它的第一個參數當做作 this 的對象。即this指向a,其他參數都直接傳遞給函數自身即b
apply()
var a = {
user:"hhh",
fn:function(a,b){
console.log(this.user); //hhh
console.log(a+b); //11
}
}
var b = a.fn;
b.apply(a,[3,5]);
解:apply() 方法有兩個參數,用作 this 的對象和要傳遞給函數的參數的數組
bind()
var a = { user:"hhh", fn:function(aa,bb,cc){ console.log(this.user); //hhh console.log(aa,bb,cc); //1 2 3 } } var b = a.fn; var c = b.bind(a,1); c(2,3);
解:bind() 方法,它其實返回一個函數,它的第一個參數當做作 this 的對象。即this指向a,其他參數按順序都傳遞給函數自身即b
this指向的應用
window.onload=function(){
var bn={
fn:function fn(){
function hj(){
console.log(this)
}
hj()
},
gn:function gn(){
function hj(obn){
console.log(obn)
}
hj(this)
},
bn:function bn(){
var that=this
function hj(){
console.log(that)
}
hj()
}
}
bn.fn() //window
bn.gn() //gn
bn.bn() //bn
}
正常情況,函數嵌套函數,裏面函數的this指向window,那我們需要他指向嵌套他的函數時有兩種方法;1:將this作為參數傳遞到被嵌套的函數裏,2:將this賦值給一個變量,讓被嵌套函數進行調用
JavaScript this的指向問題