JS中this上下文對(duì)象使用方式
JavaScript 有一套完全不同于其它語言的對(duì) this 的處理機(jī)制。 在五種不同的情況下 ,this 指向的各不相同。
有句話說得很在理 -- 誰調(diào)用它,this就指向誰
一、全局范圍內(nèi)
在全局范圍內(nèi)使用this ,它將指向全局對(duì)象(瀏覽器中為 window)
var name = 'name1'; console.log(name); this.name = 'name2'; console.log(name); console.log(this.name); window.name = 'name3'; console.log(name); console.log(this.name); console.log(window.name);

二、函數(shù)調(diào)用
直接調(diào)用一個(gè)函數(shù),this 默認(rèn)會(huì)指向全局 (瀏覽器端為window)
var name = 'name1';
function sayName(){
console.log(name);
console.log(this);
}
sayName();
window.sayName();
可以看到

還有幾個(gè)常見的情況,根據(jù)誰調(diào)用方法就指向誰的原則,this的指向要細(xì)看
// 全局 name
var name = 'name1';
var obj = {
name: 'name2',
sayName: function(){
// 調(diào)用它的時(shí)候 this指向全局
return function(){
console.log(this.name);
};
},
changeName: function(){
// 調(diào)用它的時(shí)候 this指向全局
setTimeout(function(){
this.name = 'name3';
},0);
}
};
obj.sayName()();
obj.changeName();
setTimeout(function(){
console.log(name);
console.log(obj.name);
},0);

像這些類似匿名的函數(shù),默認(rèn)都是被全局(瀏覽器下的window)對(duì)象調(diào)用,要正確地讓obj調(diào)用,就要指代好
可以用that保持this再進(jìn)行下一步,或者匿名函數(shù)傳值,或者使用call/apply/bind改變context等
var name = 'name1';
var obj = {
name: 'name2',
sayName: function(){
var that = this;
return function(){
console.log(that.name);
};
},
changeName: function(){
var that = this;
setTimeout(function(){
that.name = 'name3';
},0);
}
};
obj.sayName()(); // name2
obj.changeName();
setTimeout(function(){
console.log(name); // name1
console.log(obj.name); // name3
},0);
三、作為對(duì)象方法的調(diào)用
其實(shí)就類似上頭提到的 obj.sayName() obj.name 等
這時(shí)this會(huì)指向這個(gè)obj
四、call/apply/bind 的調(diào)用
當(dāng)使用 Function.prototype 上的 call 或者 apply ,bind 方法時(shí),函數(shù)內(nèi)的 this將會(huì)被 顯式設(shè)置為函數(shù)調(diào)用的第一個(gè)參數(shù)。
具體使用方法
我們可以稍微修改一下上頭的代碼,就可以看到this指向的改變
var name = 'name1';
var obj = {
name: 'name2',
sayName: function(){
// 返回一個(gè)默認(rèn)全局的函數(shù)
return function(){
console.log(this.name);
};
},
changeName: function(){
// 返回一個(gè)默認(rèn)全局的函數(shù)
setTimeout(function(){
this.name = 'name3';
// 然后將該函數(shù)綁定給this(當(dāng)前obj對(duì)象)
}.bind(this),0);
}
};
// obj.sayName()這個(gè)函數(shù),讓obj來調(diào)用
obj.sayName().call(obj);
// 讓this(也就是全局對(duì)象)來調(diào)用
obj.sayName().apply(this);
obj.changeName();
setTimeout(function(){
// 輸出更改之后,全局name的值
console.log(name);
// 輸出更改之后,obj對(duì)象中 name的值
console.log(obj.name);
},0);

五、作為構(gòu)造函數(shù)調(diào)用
比如 new Foo();
先來看個(gè)簡單的例子:
var name = 'name1';
function Foo(){
// 賦值this(當(dāng)前對(duì)象)的name屬性值
this.name = 'name2';
}
// new 構(gòu)造函數(shù)產(chǎn)生一個(gè)實(shí)例
var foo = new Foo();
console.log(name);
console.log(foo.name);
// 直接調(diào)用該函數(shù)
Foo();
console.log(name);

可以看到,如果函數(shù)傾向于和 new 關(guān)鍵詞一塊使用,則我們稱這個(gè)函數(shù)為構(gòu)造函數(shù),當(dāng)new 了之后,this則指向這個(gè)心創(chuàng)建的對(duì)象(這個(gè)new 的過程其實(shí)也涉及到了繼承機(jī)制)。
若直接調(diào)用這個(gè)函數(shù),this就默認(rèn)執(zhí)行全局對(duì)象了。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js預(yù)載入和JavaScript Image()對(duì)象使用介紹
- JavaScript Date對(duì)象使用總結(jié)
- JS面向?qū)ο缶幊讨畬?duì)象使用分析
- javascript控制realplayer對(duì)象使用
- javascript Array對(duì)象使用小結(jié)
- JS的Event事件對(duì)象使用方法
- JavaScript中document對(duì)象使用詳解
- javascript self對(duì)象使用詳解
- JavaScript包裝對(duì)象使用介紹
- javaScript arguments 對(duì)象使用介紹
- js 對(duì)象使用的小技巧實(shí)例分析
相關(guān)文章
基于邏輯運(yùn)算的簡單權(quán)限系統(tǒng)(實(shí)現(xiàn)) JS 版
基于邏輯運(yùn)算的簡單權(quán)限系統(tǒng)(實(shí)現(xiàn)) JS 版...2007-03-03
ztree獲取當(dāng)前選中節(jié)點(diǎn)子節(jié)點(diǎn)id集合的方法
這篇文章主要介紹了ztree獲取當(dāng)前選中節(jié)點(diǎn)子節(jié)點(diǎn)id集合的方法,實(shí)例分析了ztree的方法transformToArray使用技巧,需要的朋友可以參考下2015-02-02
js實(shí)現(xiàn)簡單的左右兩邊固定廣告效果實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)簡單的左右兩邊固定廣告效果,實(shí)例分析了javascript實(shí)現(xiàn)固定廣告的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
JS實(shí)現(xiàn)網(wǎng)站菜單拖拽移位效果的方法
這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)站菜單拖拽移位效果的方法,涉及JavaScript動(dòng)態(tài)操作頁面元素樣式的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
JavaScript設(shè)計(jì)模式之單例模式實(shí)例
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之單例模式實(shí)例,本文用一個(gè)實(shí)際例子講解JavaScript中的單例模式,需要的朋友可以參考下2014-09-09
使用js實(shí)現(xiàn)按鈕控制文本框加1減1應(yīng)用于小時(shí)+分鐘
正如標(biāo)題所言使用js實(shí)現(xiàn)按鈕控制文本框加1減1,此類主要應(yīng)用于小時(shí)+分鐘,下面有個(gè)不錯(cuò)的示例,喜歡的朋友可以參考下2013-12-12

