摘要:關(guān)鍵詞概述是什么關(guān)鍵字是中最復(fù)雜的機(jī)制之一。它是一個(gè)很特別的關(guān)鍵字,被自動(dòng)定義在所有函數(shù)的作用域中。當(dāng)調(diào)用函數(shù)時(shí),被解析成了全局變量。中提供了方法和方法實(shí)現(xiàn),這兩個(gè)方法的第一個(gè)參數(shù)接受一個(gè)對(duì)象,會(huì)把這個(gè)對(duì)象綁定到,接著在調(diào)用函數(shù)是指定這個(gè)。
this關(guān)鍵詞
概述
this是什么
this關(guān)鍵字是JavaScript中最復(fù)雜的機(jī)制之一。它是一個(gè)很特別的關(guān)鍵字,被自動(dòng)定義在所有函數(shù)的作用域中。但是即使在非常有經(jīng)驗(yàn)的JavaScript開(kāi)發(fā)者也很難說(shuō)清它到底指向什么。
世界上,JavaScript中this 的機(jī)制并沒(méi)有那么先進(jìn),但是開(kāi)發(fā)者往往會(huì)把理解過(guò)程復(fù)雜化。毫不夸張地說(shuō),不理解它的含義,大部分開(kāi)發(fā)任務(wù)都無(wú)法完成。
this都有一個(gè)共同點(diǎn),他總是返回一個(gè)對(duì)象。簡(jiǎn)單說(shuō),this就是屬性或方法‘當(dāng)前’所在的對(duì)象。
var = person ={
name :"張三",
describe:function(){
return"姓名"+this.name;}
};
person.descibe();//"姓名:張三"
為什么要使用this
this提供了一種更優(yōu)雅的方式來(lái)隱式‘傳遞’一個(gè)對(duì)象引用,因此可以將API設(shè)計(jì)的更加簡(jiǎn)介并且易于復(fù)用。
隨著你的使用模式越來(lái)越復(fù)雜,顯示傳遞上下文對(duì)象會(huì)讓代碼變得越來(lái)越混亂,使用this則不會(huì)這樣。
function indetify() {return this.name.toUpperCase();}
function speak(){ console.log("Hello, i"m"+identify.call(this)); }
var me ={name :"Kyle"};
var you ={name:"Reader"};
identify.call(me);//KYLE
identify.call(you);//READER
speak.call(me);//Hello,我是KYLE
speak.call(you);//Hello,我式READER
調(diào)用位置
想要了解this的綁定過(guò)程,首先要理解調(diào)用位置:調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置(而不是聲明的位置)。
通常來(lái)說(shuō),尋找調(diào)用位置就是尋找“函數(shù)被調(diào)用的位置”。最重要的式要分析調(diào)用棧(就是為了到達(dá)當(dāng)前執(zhí)行位置調(diào)用的所有函數(shù))。
function baz(){
//當(dāng)前調(diào)用棧式:baz。因此,當(dāng)前調(diào)用位置式全局作用域
console.log("baz");
bar();//<--bar的調(diào)用位置
}
function bar (){82
//當(dāng)前調(diào)用棧式baz-> bar。因此,當(dāng)前調(diào)用位置在baa中sonsole.log("bar");
}
baz();//<--baz的調(diào)用位置
綁定規(guī)則
默認(rèn)綁定
在一個(gè)函數(shù)體中使用this,當(dāng)該函數(shù)被獨(dú)立調(diào)用。可以把這條規(guī)則看作式無(wú)法應(yīng)用 其他規(guī)則時(shí)的默認(rèn)規(guī)則。
function foo(){
console.log(this,a);
}
var a =2
foo();//2
聲明在全局作用域中的變量(比如 var a=2)就是全局對(duì)象的一個(gè)同名屬性。當(dāng)調(diào)用foo()函數(shù)時(shí),
this a 被解析成了全局變量a。
函數(shù)調(diào)用時(shí)應(yīng)用了this 的默認(rèn)綁定,因此this指向全局對(duì)象。
隱式綁定
隱式綁定的規(guī)則需要考慮的式調(diào)用位置是否有上下文對(duì)象,或者說(shuō)是否被某個(gè)對(duì)象擁有或者包含。當(dāng)然,這種說(shuō)法并不準(zhǔn)確。
function foo(){
console.log(this.a);}
var obj = {a:2,
foo:foo};
obj.foo()//2
調(diào)用位置會(huì)使用ovj上下文來(lái)引用函數(shù),因此你可以說(shuō)函數(shù)被調(diào)用時(shí)obj對(duì)象‘’擁有或者 ‘包含’它。
隱式綁定
隱式丟失式最常見(jiàn)的this 綁定問(wèn)題,指的就是被隱式綁定的函數(shù)會(huì)丟失綁定對(duì)象,也就是說(shuō)它會(huì)應(yīng)用默認(rèn)綁定,從而把this綁定到全局對(duì)象。
function foo(){
console.log(this.a);}
var obj ={a:2,
foo:foo};
var bar = obj.foo;函數(shù)別名
var a ="Opps,global";//a式全局對(duì)象屬性
bar();//"oops,global"
bar式obj.foo的一個(gè)引用,但是實(shí)際上,他引用的是foo函數(shù)本身,因此此時(shí)的bar()其實(shí)是一個(gè)不帶任何修飾符的函數(shù)調(diào)用,因此應(yīng)用了默認(rèn)綁定。
顯示綁定
顯示綁定就是確定在調(diào)用時(shí),this所綁定的對(duì)象。JavaScript中提供了apply()方法和call方法實(shí)現(xiàn),
這兩個(gè)方法的第一個(gè)參數(shù)接受一個(gè)對(duì)象,會(huì)把這個(gè)對(duì)象綁定到this,接著在調(diào)用函數(shù)是指定這個(gè)this。
function foo(){
console.log(this.a);}
var obj ={a:2};
foo.call(obj);//2
如果傳入了一個(gè)原始值來(lái)當(dāng)作this 的綁定對(duì)象,這個(gè)原始值會(huì)被轉(zhuǎn)換成它的對(duì)象形式,這通常被稱之為"裝箱"。
new綁定
在JavaScript中,構(gòu)造函數(shù)只是一些使用new操作符時(shí)被調(diào)用的函數(shù)。包括內(nèi)置對(duì)象函數(shù)在內(nèi)的所有函數(shù)都可用new函數(shù),會(huì)自動(dòng)執(zhí)行下面的操作:
1創(chuàng)建(或者說(shuō)構(gòu)造)一個(gè)全安行的對(duì)象。
2這個(gè)新對(duì)象會(huì)綁定到函數(shù)調(diào)用的this。
3如果函數(shù)沒(méi)有返回其他對(duì)像,那么new表達(dá)式中的函數(shù)調(diào)用會(huì)自動(dòng)返回這個(gè)新對(duì)象。
function foo (a){
this.a = a;}
var bar = new foo(2);
console.log(bar.a);//2
綁定例外
被忽略的this
如果把null或者undefined作為this 的綁定對(duì)象的傳入call ,apply或者bind,這些值在調(diào)用時(shí)會(huì)被忽略,實(shí)際應(yīng)用的是默認(rèn)綁定規(guī)則。
function foo(){
console.log(this.a);}
var a = 2;
foo.call (null);//2
間接引用
有可能(有意或者無(wú)意的)創(chuàng)建一個(gè)函數(shù)的"間接引用",在著中情況下,調(diào)用這個(gè)函數(shù)會(huì)應(yīng)用默認(rèn)綁定規(guī)則。
間接引用最容易在賦值時(shí)放生:
function foo(){
console.log(this.a);}
var a =2;
var 0 = {a:3,
foo:foo};
var p = {a:4};
o.foo();//3
(p,foo = o.foo)();//2
注意事項(xiàng)
避免多層this
多層函數(shù)或方法嵌套可能導(dǎo)致不同層次的this綁定的對(duì)象不同,如下示代碼所示:
var 0 = {
f1:function (){
console.log(this);
var f2 = function(){
console.log(this);}
();}}o.f1();
上面代碼包含兩層this,結(jié)果運(yùn)行后,第一層指向?qū)ο髈,第二層指向全局對(duì)象。
避免數(shù)組方法中的this
數(shù)組的map和foreach方法,允許提供一個(gè)函數(shù)作為參數(shù)。這個(gè)函數(shù)內(nèi)部不應(yīng)該使用this。
var o = {
v:"hello",
p:["a1","a2"],
f:function f(){
this.p.forEach(function(idem){
console.log(this.v+""+item);}) }}
o.f();
上面代碼中,foreach方法的回調(diào)函數(shù)中的this,其實(shí)是指向全局對(duì)象,因此取不到o.v的值。
避免回電函數(shù)中的this 回調(diào)函數(shù)中的this 經(jīng)常會(huì)改變綁定的對(duì)象,最好的解決方案就是避免這樣使用this。
Var 0 ={
name :"臥龍學(xué)院"}
o.fn = function(){
console.log (this.name);}
var name = "前端開(kāi)發(fā)";
function f(v){
v();}f(o.fn);
上面的代碼中,f()方法的回調(diào)函數(shù)中this ,其實(shí)是指向全局對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/97090.html
摘要:除此之外,還有一種情況也會(huì)修改,在一些庫(kù)中傳入回調(diào)函數(shù),可能會(huì)強(qiáng)制改變的綁定,例如在中本例中的就是被強(qiáng)制改變綁定到了觸發(fā)事件的元素上。它們的第一個(gè)參數(shù)是一個(gè)對(duì)象,它們會(huì)把這個(gè)對(duì)象綁定到,接著在調(diào)用函數(shù)時(shí)指定這個(gè)。 理解JavaScript中的this關(guān)鍵詞 this關(guān)鍵詞是JavaScript語(yǔ)言中一個(gè)很重要,同時(shí)也是一個(gè)非常復(fù)雜的機(jī)制,它同時(shí)也是一個(gè)很特殊的關(guān)鍵詞,它一般會(huì)被自動(dòng)定義...
摘要:高亮顯示通過(guò)實(shí)現(xiàn)對(duì)關(guān)鍵詞的替換,通過(guò)添加實(shí)現(xiàn)關(guān)鍵詞高亮顯示匹配關(guān)鍵字正則高亮替換值在查詢到結(jié)果后執(zhí)行方法將查詢出來(lái)的數(shù)據(jù)傳遞過(guò)來(lái)通過(guò)來(lái)將關(guān)鍵詞替換成標(biāo)簽,同時(shí)用中的進(jìn)行綁定。 最近在做移動(dòng)real-time-search于實(shí)時(shí)搜索和關(guān)鍵詞高亮顯示的功能,通過(guò)博客的方式總結(jié)一下,同時(shí)希望能夠幫助到別人~~~ 如果不喜歡看文字的朋友我寫了一個(gè)demo方便已經(jīng)上傳到了github上,可以cl...
摘要:高亮顯示通過(guò)實(shí)現(xiàn)對(duì)關(guān)鍵詞的替換,通過(guò)添加實(shí)現(xiàn)關(guān)鍵詞高亮顯示匹配關(guān)鍵字正則高亮替換值在查詢到結(jié)果后執(zhí)行方法將查詢出來(lái)的數(shù)據(jù)傳遞過(guò)來(lái)通過(guò)來(lái)將關(guān)鍵詞替換成標(biāo)簽,同時(shí)用中的進(jìn)行綁定。 最近在做移動(dòng)real-time-search于實(shí)時(shí)搜索和關(guān)鍵詞高亮顯示的功能,通過(guò)博客的方式總結(jié)一下,同時(shí)希望能夠幫助到別人~~~ 如果不喜歡看文字的朋友我寫了一個(gè)demo方便已經(jīng)上傳到了github上,可以cl...
摘要:在中,當(dāng)使用關(guān)鍵字調(diào)用函數(shù)構(gòu)造函數(shù)時(shí),函數(shù)構(gòu)造函數(shù)中也有這個(gè)概念,但是它不是惟一的規(guī)則,而且常??梢砸脕?lái)自不同執(zhí)行上下文的不同對(duì)象。因此,我們使用調(diào)用函數(shù),可以看到這是對(duì)象,并且的屬性是正常的。 一直以來(lái),javascript里邊的this都是一個(gè)很難理解的東西,之前看的最多的就是阮一峰老師關(guān)于this的理解: http://www.ruanyifeng.com/blo... htt...
閱讀 1035·2023-04-25 22:13
閱讀 2438·2019-08-30 15:56
閱讀 2308·2019-08-30 11:21
閱讀 747·2019-08-30 11:13
閱讀 2112·2019-08-26 14:06
閱讀 2054·2019-08-26 12:11
閱讀 2368·2019-08-23 16:55
閱讀 615·2019-08-23 15:30