this指向問題分析

2021-09-19 16:33:38 字數 3148 閱讀 4546

一:全域性環境下的this

function f1()

function f2()

f1();//window

f2();//undefined

const foo=

} foo.fn();// 10

var fn1=foo.fn;

fn1();//window undefined

雖然fn函式在foo物件中作為方法被引用,但是在賦值給fn1之後,fn1的執行仍然是在window的全域性環境中。

在執行函式時,如果函式中的this是被上一級的物件所呼叫,那麼this指向的就是上一級的物件;否則只想全域性物件。

二:上下文物件呼叫中的this

當存在更複雜的呼叫關係時,有如下例題:

const person=}}

console.log(person.brother.fn());//mike

在這種巢狀的關係中,this指向最後呼叫它的物件,因此輸出mike.

const o1=

} const o2=

} const o3=

} console.log(o1.fn());//o1

console.log(o2.fn());//o1

console.log(o3.fn());//undefined

console.log(o1.fn.call(o2));
2、改寫o2

const o2=

}

const func=

} const bar=

func.logname.call(bar);

四、建構函式和this

new呼叫建構函式的具體過程:

var obj={};

obj.__proto__=foo.prototype;

foo.call(obj);

如果在建構函式**現了顯示return的情況,則分為兩種場景:

function foo();

return o;

}const instance=new foo();

console.log(instance.user);//undefined

此時instance返回的是空物件o。

function foo()

const instance=new foo();

console.log(instance.user);//lucas

此時instance返回的目標物件例項是this。

結論:如果建構函式中顯式返回乙個值,且返回的是乙個物件,那麼this就指向這個返回的物件;如果返回的不是乙個物件,那麼this仍然指向例項。

五、箭頭函式中this指向

箭頭函式使用this不適用以上標準規則,而是根據外層(函式或全域性)上下文來決定。

const fnn=)	}}

fnn.fn();//window

this出現在settimeout()中的匿名函式裡,因此this指向window物件。如果需要this指向fnn這個物件,可以巧用箭頭函式。

const fnn=)	}}

fnn.fn();//

六、this的優先順序
function foo()

const obj1=

const obj2=

obj1.foo.call(obj2);

obj2.foo.call(obj1);

function foo(a)

const obj1={}

var bar=foo.bind(obj1);

bar(2);

console.log(obj1.a);//2

上述**通過bind,將bar函式中的this繫結為obj1物件。執行bar(2)後,obj1.a的值為2。當再使用bar作為建構函式時:

var baz=new bar(3);

console.log(baz.a);

將會輸出3,bar函式本身通過bind方法構造的函式,其內部已經將this繫結為obj1,它再作為建構函式,通過new呼叫時,返回的例項已經與obj1解綁。也就是說new繫結修改了bind繫結中的this,因此new繫結的優先順序比顯式bind繫結更高。

function foo()

}const obj1=

const obj2=

const bar=foo.call(obj1);

bar.call(obj2);

將會輸出2,由於foo()的this繫結到obj1,bar()的this也會繫結到obj1,箭頭函式的繫結無法修改。

var a=123;

const foo=()=>a=>

const obj1=

const obj2=

const bar=foo.call(obj1);

bar.call(obj2);

箭頭函式的繫結無法修改,此時this繫結到window,所以會輸出123。但是如果把第一行a的賦值改為const a=123;則答案會輸出undefined,原因是因為使用const宣告的變數不會掛載到window全域性物件中,因此this指向window時自然找不到a變數。

開放題分析

模擬原生bind():

function.prototype.mybind=function(context)

f.prototype=this.prototype;

var bound=function()

bound.prototype=new f();

return bound;

}function foo(a)

const obj1={}

var bar=foo.mybind(obj1);

var baz=new bar(3);

console.log(baz.a);

JS this指向分析

例如 a 在 飯店 吃 餃子 執行主體就是a 上下文就是飯店 吃餃子就是行為 function 吃餃子 a.吃餃子 輸出this 指a function this是誰 和函式在哪定義的和在哪執行的沒有任何關係,就是指執行主體 複製 1 函式執行,首先看函式前面是否有 有的話前面是誰,this就是誰,...

this指向問題

一 this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件 例項一 函式this指向 function a a undefined windowwindow.a undefined window 解釋 這裡的a函式指向的...

this指向問題

在普通的函式中this指向window 在定時器中指向window,其實普通的函式和定時器都是window下的方法,所以都指向window 在乙個物件中的方法中this批向當前物件 new了 綁事件是事件源 真正觸發的 function fn a,b var aa fn.call 普通模式下this...