this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件(這句話不那麼嚴謹,作為一般情況下是可以的)
再加下面的補充,就完美啦:
情況1:如果乙個函式中有this,但是它沒有被上一級的物件所呼叫,那麼this指向的就是window,這裡需要說明的是在js的嚴格版中this指向的不是window,但是我們這裡不**嚴格版的問題(在嚴格版中的預設的this不再是window,而是undefined。)
functiona()
a(); //相當於window.a();
//this最終指向的是呼叫它的物件,這裡的函式a實際是被window物件所點出來的
var
o =
}}o.fn(); //this執行時被它的上一級物件o呼叫
var
o =
},fn1:function()}
o.fn1();
o.b.fn();
另外還有兩種種特殊情況:
第一種:當this遇到return
function
fn()
; }
var a = new
fn;
console.log(a.user); //undefined
function
fn();}
var a = new
fn;
console.log(a.user); //undefined
function
fn()
var a = new
fn;
console.log(a.user); //追夢子
function
fn()
var a = new
fn;
console.log(a.user); //追夢子
function
fn()
var a = new
fn;
console.log(a.user); //追夢子
總結:如果返回值是乙個物件,那麼this指向的就是那個返回的物件,如果返回值不是乙個物件那麼this還是指向函式的例項。
還有一點就是雖然null也是物件,但是在這裡this還是指向那個函式的例項,因為null比較特殊。
第二種:
var
o =
}}var
j = o.b.fn;
j();
這裡this指向的是window,是不是有些蒙了?其實是因為你沒有理解一句話,這句話同樣至關重要。
this永遠指向的是最後呼叫它的物件,也就是看它執行的時候是誰呼叫的,例子4中雖然函式fn是被物件b所引用,但是在將fn賦值給變數j的時候並沒有執行所以最終指向的是window
第一種: new關鍵字改變this指向
//建構函式版this
function
fn()
var a = new
fn();
console.log(a.user); //追夢子
用變數a建立了乙個fn的例項(相當於複製了乙份fn到物件a裡面),此時僅僅只是建立,並沒有執行,而呼叫這個函式fn的是物件a,那麼this指向的自然是物件a,那麼為什麼物件a中會有user,因為你已經複製了乙份fn函式到物件a中,用了new關鍵字就等同於複製了乙份
第二種: call()
var
a =
}var
b = a.fn;
b.call(a); //若不用call,則b()執行後this指的是window物件
把b新增到第乙個引數的環境中,簡單來說,this就會指向那個物件。
call方法除了第乙個引數以外還可以新增多個引數,如下:
var
a =
}var
b = a.fn;
b.call(a,1
,2);
var
a =
}var
b = a.fn;
vara =
}var
b = a.fn;
,1]);
//
,那麼this
指向的是window
物件var
a =
}}var
b = a.fn;
);
第四種:bind()var
a =
}var
b = a.fn;
b.bind(a); //**沒有被列印
var
a =
}var
b = a.fn;
var c = b.bind(a);
console
.log(c); //
function
()
函式c看看,能不能列印出物件a裡面的user
var
a =
}var
b = a.fn;
var c = b.bind(a);
c();
同樣bind也可以有多個引數,並且引數可以執行的時候再次新增,但是要注意的是,引數是按照形參的順序進行的。
var
a =
}var
b = a.fn;
var c = b.bind(a,10
);c(1
,2);
**:my
this的指向及改變this指向問題
this的指向問題 1,普通函式中的this是指向window 非嚴格模式 2,普通函式中的this是指向undefined 嚴格模式 嚴格模式是es5提出的 function foo foo 3,建構函式中的this是例項物件 4,原型方法中的this是例項物件 與建構函式中的this相同 5,定...
this指向及改變this指向的方法
一 函式的呼叫方式決定了 this 的指向不同,但總的原則,this指的是呼叫函式的那個物件 1.普通函式呼叫,此時 this 指向 全域性物件window function fn fn 此處預設省略window 2.在嚴格模式下 use strict 為undefined.function foo...
this指向 改變this指向
常見的this指向 常見的this指向 全域性下的this指向window 函式中的this,誰呼叫指向誰 建構函式中的this指向建構函式的物件 物件中的this預設指向當前物件 事件處理函式中this誰觸發指向誰 指向觸發事件的目標元素 定時器函式,this 指向 window 箭頭函式中沒有t...