日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

嵌套函数中的this指向的对象

發(fā)布時(shí)間:2023/12/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌套函数中的this指向的对象 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來源:http://www.cnblogs.com/mier/archive/2009/05/07/1452231.html

?

我們通過一個(gè)測試來舉出所有的情況,然后用自己的debug方法輸出結(jié)果來判斷嵌套時(shí)的this指向的對象是自己還是父對象

下面是這個(gè)測試的前提html和css代碼,用來顯示測試結(jié)果:


?1 < style? type ="text/css" >
?2 .block {
?3 ????margin-top : 5px ;
?4 ????padding : 10px ;
?5 ????font-family : Verdana ;
?6 ????font-size : 12px ;
?7 ????background-color : #e0ecf9 ;
?8 ????width : 90% ;
?9 ????overflow : hidden ;
10 ????border : 1px?#4B8FE3?solid ;
11 ????padding-left : 4px ;
12 ???? }

13
</ style >
14 < div? id ="debug1" ?class ="block" >
15 .
16 </ div >

之后是一些增加的系統(tǒng)函數(shù),用來更方便的實(shí)現(xiàn)某些測試功能:

?

?


?1 function ?$$(ele) {
?2 ???????? return ?document.getElementById(ele);
?3 ????????}

?4 function ?adddebug(e1,e2) {
?5 ????????$$( " debug1 " ).innerHTML += e1 + " : " + e2 + " <br?/> " ;
?6 ????????}

?7 // 用來顯示當(dāng)前對象的所有屬性和方法,用來測試this所指的對象,以及輸出所有的屬性的值
?8 Object.prototype.printToScreen = function (objname,ele) {
?9 ????div = document.createElement( " div " );
10 ????div.className = " block " ;
11 ????div.innerHTML += " 當(dāng)前對象+ " + objname + " <br?/> " + " <HR/> " ;
12 ????count = 7 ;
13 ???? for (i? in ? this ) {
14 ???????? if (count == 0 )? {div.innerHTML += " 此對象含有大量的屬性,已經(jīng)省略之 " ; break ;}
15 ???????div.innerHTML += " <font?color=#ff00ff> " + i + " </font> " + " : " + " <font?color=#0ff00d> " + this [i] + " </font> " + " <br?/> " ;
16 ???????count -- ;
17 ????????}

18 ????$$( " debug1 " ).appendChild(div);
19 ????}

?

為了測試在不同情況下嵌套函數(shù)(對象)中this所指的對象,我們寫了如下的代碼(在代碼中已經(jīng)標(biāo)識(shí)出各種情況的分析結(jié)果):

?


?1 function ?testA() {
?2 ?????????? ? this .name = " a " ;
?3 ????????? this .func1 = function () {
?4 ?????????????????? this .name1 = " a1 " ;
?5 ?????????????????? this .name = " b " ;
?6 ?????????????????? this .printToScreen( " func1 " , " debug1 " );
?7 ???????????? // 這里的this指向了外部函數(shù)的this
?8 ????????????}

?9 ?????????? ? this .func1();
10
11
12 ??????? ? function ?func2() {
13 ?????????????????? this .name1 = " b1 " ;
14 ?????????????????? this .name = " c " ;
15 ?????????????????? this .printToScreen( " func2 " , " debug1 " );
16 ???????????? // 這里的this不指向外部的this,而是自身環(huán)境的this
17 ????????????}

18 ?????????? var ?func2 = new ?func2();
19
20
21 ???????? var ?func3 = function () {
22 ?????????????????? this .name1 = " b1 " ;
23 ?????????????????? this .name = " c " ;
24 ?????????????????? this .printToScreen( " func3 " , " debug1 " );
25 ???????????? // 這種方式也不影響外部的值,this指向自身的環(huán)境
26 ????????????}

27 ????????? func3();
28
29 ???????? this .a = function ?func4() {
30 ?????????????????? this .name1 = " b1 " ;
31 ?????????????????? this .name = " c " ;
32 ?????????????????? this .printToScreen( " func4 " , " debug1 " );
33 ???????????? // 這種方式也會(huì)影響外部的this,這里的this指向外部的this
34 ????????????}

35 ???????? this .a();
36
37 ????????}

38 ???????? var ?testa = new ?testA();
39 ???????? this .name = " aa " ;
40 ?????? this .func5 = function () {
41 ?????????????? this .printToScreen( " func5 " , " debug1 " );
42 ???????????? }

45 ???????? this .func5();

?

總結(jié):

??????javascript中的函數(shù)是頂級對象,每次創(chuàng)建一個(gè)函數(shù)的時(shí)候我們就會(huì)為其創(chuàng)建一個(gè)運(yùn)行環(huán)境,這個(gè)環(huán)境中包含一個(gè)作用域鏈屬性,它可以指向外部的對象來實(shí)現(xiàn)外部變量對于函數(shù)內(nèi)部是可見的(具體在其他文章中討論閉包的時(shí)候討論),所以在javascript中函數(shù)是可以嵌套的 , 也就是說在定義了一個(gè)函數(shù)后,在函數(shù)內(nèi)部仍然可以定義一個(gè)函數(shù),而且外部函數(shù)內(nèi)定義的變量在內(nèi)部函數(shù)中是可見的(在php中則是不可見的),通過環(huán)境中的 作用域鏈,內(nèi)部函數(shù)在初始化的時(shí)候順著作用域鏈可以找到其外部任何層級的函數(shù)(對象)中的變量.在完成一系列初始化工作后,將給當(dāng)前的this賦 值,this屬性指向運(yùn)行環(huán)境所指向的對象本身,所以在全局環(huán)境中我們也可以使用this關(guān)鍵字,這時(shí)它指向全局對象.

??????我們這里考慮的是javascript中this指針指 向的對象,當(dāng)在某個(gè)函數(shù)內(nèi)嵌套一個(gè)函數(shù)的時(shí)候,有好幾種方法,可以將內(nèi)部函數(shù)直接復(fù)制給外部函數(shù)對象的一個(gè)屬性,也可以單獨(dú)創(chuàng)建一個(gè)函數(shù).這些不同的方法 中 在內(nèi)部對象中使用this指針?biāo)赶虻膶ο笫遣煌?通過上面的例子可以看到不同的情況下this所指向

??????上面的所有情況其實(shí)分為兩大種:

??????第一種是在外部函數(shù)的內(nèi)部直接定義一個(gè)對象,這個(gè)對象不作為外部對象的屬性出現(xiàn):

????????????這種情況下內(nèi)部函數(shù)中的this指向此內(nèi)部函數(shù),這是正常創(chuàng)建函數(shù)的方法,所以會(huì)為內(nèi)部函數(shù)創(chuàng)建自己的運(yùn)行環(huán)境,this指向這個(gè)運(yùn)行環(huán)境

??????第二種情況是定義一個(gè)函數(shù),然后賦給外部對象的一個(gè)屬性.

????????????這種情況下并不會(huì)給這個(gè)內(nèi)部函數(shù)創(chuàng)建運(yùn)行環(huán)境,而是以外部對象的運(yùn)行環(huán)境作為當(dāng)前的運(yùn)行環(huán)境,所以這時(shí)候this指向的是外部的對象.

總結(jié)

以上是生活随笔為你收集整理的嵌套函数中的this指向的对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。