this指向詳解及改變它的指向的方法

2021-08-22 06:16:46 字數 3255 閱讀 9091

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;

var

a =

}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...