摘要:否則報(bào)錯(cuò)在嚴(yán)格模式下,對(duì)象的函數(shù)中的指向調(diào)用函數(shù)的對(duì)象實(shí)例同樣道理,可以推斷出,在嚴(yán)格模式下,構(gòu)造函數(shù)中的指向構(gòu)造函數(shù)創(chuàng)建的對(duì)象實(shí)例。
要點(diǎn)
this的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰,實(shí)際上this的最終指向的是那個(gè)調(diào)用它的對(duì)象。
this指向的三種情況情況1:如果一個(gè)函數(shù)中有this,但是它沒有被上一級(jí)的對(duì)象所調(diào)用,那么this指向的就是window,這里需要說明的是在js的嚴(yán)格版中this指向的不是window,而是指向調(diào)用函數(shù)的對(duì)象實(shí)例,這種函數(shù)中的this等于undefined。
function a(){ var user = "維他奶"; console.log(this);//window console.log(this.user);//undefined } //windonw是全局對(duì)象,所有的全局變量都是對(duì)象的屬性. //a()<=>window.a() a(); console.log(window); console.log(window.user);//根本沒有user這個(gè)屬性。只有一個(gè)name="";
運(yùn)行結(jié)果
嚴(yán)格模式,請(qǐng)參照https://segmentfault.com/a/11...
嚴(yán)格模式下定義變量必須使用var。否則報(bào)錯(cuò).
在嚴(yán)格模式下,對(duì)象的函數(shù)中的this指向調(diào)用函數(shù)的對(duì)象實(shí)例
同樣道理,可以推斷出,在嚴(yán)格模式下,構(gòu)造函數(shù)中的this指向構(gòu)造函數(shù)創(chuàng)建的對(duì)象實(shí)例。
"use strict";//開啟嚴(yán)格模式 function a(){ var user = "維他奶"; //在嚴(yán)格模式下,對(duì)象的函數(shù)中的this指向調(diào)用函數(shù)的對(duì)象實(shí)例 console.log(this);//a{} console.log(this.user);//undefined } var A = new a();
運(yùn)行結(jié)果
情況2:如果一個(gè)函數(shù)中有this,這個(gè)函數(shù)有被上一級(jí)的對(duì)象所調(diào)用,那么this指向的就是上一級(jí)的對(duì)象。
var sum = { a:10, b:{ a:12, fn:function(){ console.log(this.a);//12 } } } sum.b.fn();
運(yùn)行結(jié)果
情況3:如果一個(gè)函數(shù)中有this,盡管這個(gè)函數(shù)是被最外層的對(duì)象所調(diào)用,this指向的也只是它上一級(jí)的對(duì)象.
var sum = { a:10, b:{ // a:12, fn:function(){ console.log(this.a);//undefined } } } sum.b.fn();
運(yùn)行結(jié)果
注意事項(xiàng)
盡管對(duì)象b中沒有屬性a,這個(gè)this指向的也是對(duì)象b,因?yàn)閠his只會(huì)指向它的上一級(jí)對(duì)象,不管這個(gè)對(duì)象中有沒有this要的東西。
情況4:this永遠(yuǎn)指向的是最后調(diào)用它的對(duì)象,也就是看它執(zhí)行的時(shí)候是誰調(diào)用的,情況4中雖然函數(shù)fn是被對(duì)象b所引用,但是在將fn賦值給變量num的時(shí)候并沒有執(zhí)行所以最終指向的是window,這和情況3是不一樣的,情況3是直接執(zhí)行了fn。
var sum = { a1:10, b:{ a:12, fn:function(){ console.log(this.a1);//undefined console.log(this);//window } } } var num = sum.b.fn; num();
運(yùn)行結(jié)果
構(gòu)造函數(shù)的this指向:function A(){ this.name = "維他奶"; } var a = new A(); console.log(a.name);//維他奶
運(yùn)行結(jié)果
new關(guān)鍵字到底做了什么?
(1) 創(chuàng)建一個(gè)新對(duì)象;
(2) 將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此 this 就指向了這個(gè)新對(duì)象);原理:自動(dòng)調(diào)用apply方法,將this指向這個(gè)空對(duì)象,這樣的話函數(shù)內(nèi)部的this就會(huì)被這個(gè)空的對(duì)象替代。
(3) 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性);
(4) 返回新對(duì)象。
return 會(huì)把new創(chuàng)建的this覆蓋.
如果返回值是復(fù)雜數(shù)據(jù)類型,那么this指向的就是那個(gè)返回的對(duì)象,如果返回值不是復(fù)雜數(shù)據(jù)類型那么this還是指向函數(shù)的實(shí)例。
function A(){ this.name = "維他奶"; return 1; } var a = new A(); console.log(a.name);//維他奶 function A(){ this.name = "維他奶"; return ; } var a = new A(); console.log(a.name);//維他奶 function A(){ this.name = "維他奶"; return function(){}; } var a = new A(); //傳入空函數(shù),所以輸出一個(gè)空,而不是undefined console.log(a.name);//"" function A(){ this.name = "維他奶"; return null; } var a = new A(); console.log(a.name);//維他奶
簡(jiǎn)單數(shù)據(jù)類型:string,boolean,number,undefined,null,NaN
復(fù)雜數(shù)據(jù)類型: Object,Function,Array,String,Boolean,Number
其中String,Boolean,Number,是自帶的封裝好的方法。
簡(jiǎn)單數(shù)據(jù)類型存放在內(nèi)存的棧中,而復(fù)雜數(shù)據(jù)類型存放在內(nèi)存的堆中,把地址存放在內(nèi)存的棧中,先獲取地址,再讀取堆中數(shù)據(jù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107847.html
摘要:例如通過,調(diào)用時(shí)強(qiáng)制把它的綁定到上。箭頭函數(shù)問題箭頭函數(shù)體內(nèi)的對(duì)象就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象,固定不變。 剛?cè)腴Tjavascript,關(guān)于this的學(xué)習(xí),花了自己挺多的時(shí)間,做了比較多的功課,看了一篇又一篇的文章,也看了一些書籍,今天就結(jié)合看的那些東西總結(jié)下自己所學(xué)到的東西,方便留著以后回看,進(jìn)一步的學(xué)習(xí),這篇文章會(huì)不斷的更新,不斷的更新自己的想法,現(xiàn)在還是一個(gè)入門不...
摘要:在全局對(duì)象中調(diào)用,自然讀取的是全局對(duì)象的值構(gòu)造器調(diào)用說明作為構(gòu)造器調(diào)用時(shí),指向返回的這個(gè)對(duì)象。最直觀的表現(xiàn)就是,去看一些優(yōu)秀框架的源代碼時(shí),不再是被繞的暈乎乎的。 學(xué)習(xí)起因: 在之前的JavaScript學(xué)習(xí)中,this,call,apply總是讓我感到迷惑,但是他們的運(yùn)用又非常的廣泛。遂專門花了一天,來弄懂JavaScript的this,call,apply。中途參考的書籍也很多,以...
摘要:匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此它的對(duì)象通常指向。如果對(duì)此有疑惑,可以看知乎上的答案知乎匿名函數(shù)的指向?yàn)槭裁词亲鳛閷?duì)象方法的調(diào)用,指向該對(duì)象當(dāng)函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),就指這個(gè)函數(shù)所在的對(duì)象。 因?yàn)槿粘9ぷ髦薪?jīng)常使用到this,而且在JavaScript中this的指向問題也很容易讓人混淆一部分知識(shí)。 這段時(shí)間翻閱了一些書籍也查閱了網(wǎng)上一些資料然后結(jié)合自己的經(jīng)驗(yàn),為了能讓自...
摘要:當(dāng)碰到時(shí)呵呵再看一個(gè)呵呵再來呵呵呵呵呵呵呵呵什么意思呢如果返回值是一個(gè)對(duì)象,那么指向的是構(gòu)造函數(shù)的實(shí)例但是并沒有被返回,如果返回值不是一個(gè)對(duì)象那么還是指向構(gòu)造函數(shù)創(chuàng)建的實(shí)例。 為什么要學(xué)習(xí)this?如果你學(xué)過面向?qū)ο缶幊蹋悄憧隙ㄖ栏墒裁从玫?,如果你沒有學(xué)過,那么暫時(shí)可以不用看這篇文章,當(dāng)然如果你有興趣也可以看看,畢竟這是js中必須要掌握的東西。 1. this指向調(diào)用他的對(duì)象 首先...
摘要:面向?qū)ο笾杏腥筇卣?,封裝,繼承,多態(tài)。這不僅無法做到數(shù)據(jù)共享,也是極大的資源浪費(fèi),那么引入對(duì)象實(shí)例對(duì)象的屬性指向其構(gòu)造函數(shù),這樣看起來實(shí)例對(duì)象好像繼承了對(duì)象一樣。實(shí)例對(duì)象的原型指向其構(gòu)造函數(shù)的對(duì)象構(gòu)造器的指向。 前言 為什么說是再談呢,網(wǎng)上講解這個(gè)的博客的很多,我開始學(xué)習(xí)也是看過,敲過就沒了,自以為理解了就結(jié)束了,書到用時(shí)方恨少啊。實(shí)際開發(fā)中一用就打磕巴,于是在重新學(xué)習(xí)了之后分享出來...
閱讀 2175·2021-11-11 16:55
閱讀 1698·2019-08-30 15:54
閱讀 2827·2019-08-30 15:53
閱讀 2224·2019-08-30 15:44
閱讀 1160·2019-08-30 15:43
閱讀 975·2019-08-30 11:22
閱讀 1954·2019-08-29 17:20
閱讀 1576·2019-08-29 16:56