JavaScript中的this基本問(wèn)題實(shí)例小結(jié)
本文實(shí)例講述了JavaScript中的this基本問(wèn)題.分享給大家供大家參考,具體如下:
在函數(shù)中 this 到底取何值,是在函數(shù)真正被調(diào)用執(zhí)行的時(shí)候確定下來(lái)的,函數(shù)定義的時(shí)候確定不了。
執(zhí)行上下文環(huán)境 :
**定義**:執(zhí)行函數(shù)的時(shí)候,會(huì)產(chǎn)生一個(gè)上下文的對(duì)象,里面保存變量,函數(shù)聲明和this。
**作用**:用來(lái)保存本次運(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 出來(lái)的對(duì)象,一般構(gòu)造函數(shù)的函數(shù)名首字母大寫(xiě),例如像 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 出來(lái)的對(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è)全局變量,并沒(méi)有作為 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ì)象的值。
來(lái)源:知乎
鏈接: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測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容還可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《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)文章
JavaScript實(shí)現(xiàn)的簡(jiǎn)單加密解密操作示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的簡(jiǎn)單加密解密操作,涉及javascript基于charCodeAt與fromCharCode的字符串編碼與解碼操作相關(guān)使用技巧,需要的朋友可以參考下2018-06-06javascript四舍五入函數(shù)代碼分享(保留后幾位)
這篇文章主要介紹了javascript四舍五入函數(shù)分享,大家參考使用吧2013-12-12uniapp使用u-upload組件來(lái)實(shí)現(xiàn)圖片上傳功能
最近在用uniapp開(kāi)發(fā)微信小程序,下面這篇文章主要給大家介紹了關(guān)于uniapp使用u-upload組件來(lái)實(shí)現(xiàn)圖片上傳功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01修改layui的后臺(tái)模板的左側(cè)導(dǎo)航欄可以伸縮的方法
今天小編就為大家分享一篇修改layui的后臺(tái)模板的左側(cè)導(dǎo)航欄可以伸縮的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09layui禁用側(cè)邊導(dǎo)航欄點(diǎn)擊事件的解決方法
今天小編就為大家分享一篇layui禁用側(cè)邊導(dǎo)航欄點(diǎn)擊事件的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JavaScript實(shí)現(xiàn)新年倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)新年倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11javascript記錄文本框內(nèi)文字個(gè)數(shù)檢測(cè)文字個(gè)數(shù)變化
要對(duì)文本框中用戶輸入的文字進(jìn)行記數(shù),在下面顯示出來(lái),經(jīng)研究找到個(gè)不錯(cuò)的方法,可以完美解決在刪除文字后,字?jǐn)?shù)變化問(wèn)題2014-10-10