JavaScript中的this基本問題實(shí)例小結(jié)
本文實(shí)例講述了JavaScript中的this基本問題.分享給大家供大家參考,具體如下:
在函數(shù)中 this 到底取何值,是在函數(shù)真正被調(diào)用執(zhí)行的時(shí)候確定下來的,函數(shù)定義的時(shí)候確定不了。
執(zhí)行上下文環(huán)境 :
**定義**:執(zhí)行函數(shù)的時(shí)候,會(huì)產(chǎn)生一個(gè)上下文的對(duì)象,里面保存變量,函數(shù)聲明和this。
**作用**:用來保存本次運(yùn)行時(shí)所需要的數(shù)據(jù)
當(dāng)你在代碼中使用了 this,這個(gè) this 的值就直接從執(zhí)行的上下文中獲取了,而不會(huì)從作用域鏈中搜尋。
關(guān)于 this 的取值,大體上可以分為以下幾種情況:
情況一:全局 & 調(diào)用普通函數(shù)
在全局環(huán)境中,this 永遠(yuǎn)指向 window。
console.log(this === window); //true
普通函數(shù)在調(diào)用時(shí)候(注意不是構(gòu)造函數(shù),前面不加 new),其中的 this 也是指向 window。
但是如果在嚴(yán)格模式下調(diào)用的話會(huì)報(bào)錯(cuò):
var x = 1;
function first(){
console.log(this); // undefined
console.log(this.x); // Uncaught TypeError: Cannot read property 'x' of undefined
}
first();
情況二:構(gòu)造函數(shù)
所謂的構(gòu)造函數(shù)就是由一個(gè)函數(shù) new 出來的對(duì)象,一般構(gòu)造函數(shù)的函數(shù)名首字母大寫,例如像 Object,F(xiàn)unction,Array 這些都屬于構(gòu)造函數(shù)。
function First(){
this.x = 1;
console.log(this); //First {x:1}
}
var first = new First();
console.log(first.x); //1
上述代碼,如果函數(shù)作為構(gòu)造函數(shù)使用,那么其中的 this 就代表它即將 new 出來的對(duì)象。
但是如果直接調(diào)用 First函數(shù),而不是 new First(),那就變成情況1,這時(shí)候 First() 就變成普通函數(shù)。
function First(){
this.x =1;
console.log(this); //Window
}
var first = First();
console.log(first.x); //undefined
情況三:對(duì)象方法
如果函數(shù)作為對(duì)象的方法時(shí),方法中的 this 指向該對(duì)象。
var obj = {
x: 1,
first: function () {
console.log(this); //Object
console.log(this.x); //1
}
};
obj.first();
注意:若是在對(duì)象方法中定義函數(shù),那么情況就不同了。
var obj = {
x: 1,
first: function () {
function second(){
console.log(this); //Window
console.log(this.x); //undefined
}
second();
}
}
obj.first();
可以這么理解:函數(shù) second雖然是在 obj.first 內(nèi)部定義的,但它仍然屬于一個(gè)普通函數(shù),this 仍指向 window。
在這里,如果想要調(diào)用上層作用域中的變量 obj.x,可以使用 self 緩存外部 this 變量。
var obj = {
x:1,
first: function () {
var self = this;
function second(){
console.log(self); //{x: 1}
console.log(self.x); //1
}
second();
}
}
obj.first();
如果 first 函數(shù)不作為對(duì)象方法被調(diào)用:
var obj = {
x: 1,
first: function () {
console.log(this); //Window
console.log(this.x); //undefined
}
};
var fn = obj.first;
fn();
obj.first 被賦值給一個(gè)全局變量,并沒有作為 obj 的一個(gè)屬性被調(diào)用,那么此時(shí) this 的值是 window。
情況四:構(gòu)造函數(shù) prototype 屬性
function First(){
this.x = 1;
}
First.prototype.getX = function () {
console.log(this); //First {x: 1, getX: function}
console.log(this.x); //1
}
var first= new First();
first.getX();
在 First.prototype.getX 函數(shù)中,this 指向的first 對(duì)象。不僅僅如此,即便是在整個(gè)原型鏈中,this 代表的也是當(dāng)前對(duì)象的值。
情況五:函數(shù)用 call
var obj = {
x:1
}
function first(){
console.log(this); //{x: 1}
console.log(this.x); //1
}
first.call(obj);
當(dāng)一個(gè)函數(shù)被 call調(diào)用時(shí),this 的值就取傳入的對(duì)象的值。
來源:知乎
鏈接:https://zhuanlan.zhihu.com/p/25294187?utm_source=com.youdao.note&utm_medium=social
感興趣的朋友可以使用在線HTML/CSS/JavaScript前端代碼調(diào)試運(yùn)行工具:http://tools.jb51.net/code/WebCodeRun測試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容還可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
vue使用vue-quill-editor富文本編輯器且將圖片上傳到服務(wù)器的功能
這篇文章主要介紹了vue使用vue-quill-editor富文本編輯器且將圖片上傳到服務(wù)器的功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
利用JavaScript實(shí)現(xiàn)檢測用戶是否在線功能
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)檢測用戶是否在線功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12
使用weixin-java-miniapp配置進(jìn)行單個(gè)小程序的配置詳解
這篇文章主要介紹了使用weixin-java-miniapp配置進(jìn)行單個(gè)小程序的配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
用Javascript評(píng)估用戶輸入密碼的強(qiáng)度實(shí)現(xiàn)代碼
用Javascript評(píng)估用戶輸入密碼的強(qiáng)度實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-11-11
JS實(shí)現(xiàn)頁面導(dǎo)航與內(nèi)容相互錨定實(shí)例詳解
這篇文章主要為大家介紹了JS實(shí)現(xiàn)頁面導(dǎo)航與內(nèi)容相互錨定實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
javascript精確統(tǒng)計(jì)網(wǎng)站訪問量實(shí)例代碼
網(wǎng)站一般都有訪問量統(tǒng)計(jì)工具,比較高效實(shí)用的工具多種多樣,這篇文章主要介紹了javascript精確統(tǒng)計(jì)網(wǎng)站訪問量實(shí)例代碼,感興趣的小伙伴們可以參考一下2015-12-12
手機(jī)端網(wǎng)頁點(diǎn)擊鏈接觸發(fā)自動(dòng)撥打或保存電話的示例代碼
通過網(wǎng)頁撥打電話,在點(diǎn)擊鏈接時(shí)觸發(fā)自動(dòng)撥打或保存電話,此方法塞班、安卓與iphone都支持2014-08-08
固定網(wǎng)頁背景圖同時(shí)保持圖片比例的思路代碼
代碼功能:背景圖片固定,隨窗口大小改變而改變大小,保持比例不變而縮放,有此需求的朋友可以參考下2013-08-08

