<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JS中this引發(fā)bug分析

        來源:懂視網 責編:小采 時間:2020-11-27 20:10:18
        文檔

        JS中this引發(fā)bug分析

        JS中this引發(fā)bug分析:在 js 中,this 這個上下文總是變化莫測,很多時候出現bug 總是一頭霧水,其實,只要分清楚不同的情況下如何執(zhí)行就可以了,本文主要介紹了分析JavaScript中this引發(fā)的bug以及相關的處理方法分析,希望能幫助到大家。在JavaScript中有一個很特別、很常用
        推薦度:
        導讀JS中this引發(fā)bug分析:在 js 中,this 這個上下文總是變化莫測,很多時候出現bug 總是一頭霧水,其實,只要分清楚不同的情況下如何執(zhí)行就可以了,本文主要介紹了分析JavaScript中this引發(fā)的bug以及相關的處理方法分析,希望能幫助到大家。在JavaScript中有一個很特別、很常用
        在 js 中,this 這個上下文總是變化莫測,很多時候出現bug 總是一頭霧水,其實,只要分清楚不同的情況下如何執(zhí)行就可以了,本文主要介紹了分析JavaScript中this引發(fā)的bug以及相關的處理方法分析,希望能幫助到大家。

        在JavaScript中有一個很特別、很常用又常常讓初學者很困擾的東西 ─ “this”,在這堂課中會來談談這個”this”。

        this通常會指向一個對象,同時this會在不同的情境下指向不同的對象。讓我們來看幾個不同的情境,幫助我們更了解”this”。

        window object (global object)

        這里我們在三種不同情境去打印”this”,分別是在函數的最外層(outer environment)直接去執(zhí)行;使用fuction statement去執(zhí)行;使用function expression去執(zhí)行(如果還不清楚function statement和function expression的差別,可以參考注1)。


        結果會發(fā)現,這三個”this”都會指向同樣的對象,也就是global environment的window object (global object):


        這也就是說,我們可以直接利用這個function和this在window object建立新的屬性:

        在這里我們利用this.NewVariable = "..."來在window object建立新的屬性,函數的最后,我們則可以直接console.log(NewVariable),這里之所以可以不用打this.NewVariable或window.NewVariable是因為任何在global object (window)的屬性,我們都可以直接去使用它,而不用使用”.”。


        跑出來的結果會像這樣子:


        它會打印出我們的”Create a new property”,同時,在window這個大的object中,我們也會找到NewVariable這個屬性:


        method in object

        我們知道,在對象里的值如果是原生值(primitive type;例如,字串、數值、邏輯值),我們會把這個新建立的東西稱為「屬性(property)」;如果對象里面的值是函數(function)的話,我們則會把這個新建立的東西稱為「方法(method)」。

        在這里,我們就要來建立method:

        首先,我們利用object literal的方式創(chuàng)建一個對象c,里面包含屬性name和方法log。log是一個匿名函數(anonymous function),函數內容很簡單,就是打印this而已(關于匿名函數可參考注1)。最后則是使用c.log的方式來執(zhí)行該方法。


        讓我們來看看,這時候的”this”會是什么呢?

        答案是對象c!

        當這個函數是對象里面的method時,這時候的this就會指向到包含這個method的對象


        JavaScript中關于this的一個bug

        讓我們更進一步延伸來看這個范例:

        假設我們在method log裡面多這一行this.name = "Updated Object C name"


        因為我們知道”this”現在指的是對象c,所以可以想像的,當我執(zhí)行這個method的時候,它會去變更c.name的值。


        這個部分是沒有什么大問題的,不過讓我們繼續(xù)看下去……。

        假設我在method log裡面在做一些變更,我在這個method裡面,另外建立一個函數叫做setname,一樣是用this.name = newname的方式來修改這個object c中name屬性的值。

        接著執(zhí)行setname這個函數,希望把object c中name的屬性值改成”New name for object c”,最后再去打印”this”來看一下。


        結果我們會發(fā)現,對象c中name屬性的值并沒有變成”New name for object c”,竟然還是一樣!?怎么會這樣呢?


        仔細一看,我們回來看一下我們的window object,我們會發(fā)現,在window object中發(fā)現了一個新的屬性”name”,而且值是”New name for object c”。


        這是什么意思呢?意思是原來我們剛剛在函數setname里面的this,指向到的是global object (window object),而不再是剛剛的object C!


        我們在setname這個function中,用console.log(this)來看一下:


        在log這個method中,我們一共執(zhí)行了三次的console.log(this)結果如下:

        第一個和第三個”this”指向到的是對象c,而第二個在setname中的this,指向的則是window object (global object),而這也就是為什么setname這個function沒辦法幫我們修改對象c中name屬性的名稱,因為”this”根本沒指向到對象c。


        而許多人都認為,這是JavaScript的一個bug。

        那么我們可以怎么做

        那么碰到上述的這個例子時,我們可以怎么做來避免指向到不同的對象呢?

        許多人的解法是這樣的,因為我們知道對象都是用的引用的方式,所以我們可以這樣做

        STEP 1

        我們在整個函數的最上面加上一行var self = this(有些人會用var that = this)。由于引用的特性,self和this會指向到同一個對象,而this指向對象c,所以self一樣會指向對象c。

        STEP 2

        接著,把方法log內原本使用的”this”都改成”self”,這樣做可以確保self指向到的是c對象而不用擔心會像上面的例子一樣指向到錯誤的對象。


        結果也如同我們預期的,在第二次console.log(self)的時候,就再次替換了對象c中name屬性的值。


        總結

        讓我們來總結一下:

        如果我們是在全局環(huán)境建立函數并打印this,這時候this會指向到全局對象,也就是window對象。

        如果我們是在對象里面創(chuàng)建函數,也就是方法(method)的情況時,這時候的this一般就會指向到包含這個方法的對象(之所以說”一般”是因為除了上述bug的情況之外)。

        碰到method中可能會有不知道this指向到什么的情況時,為了避免不必要的錯誤,我們可以在method中的最上面建立一個變量,去把它指定成this(var self = this)。

        4.如果真的還是不知道那個情況下的this會指向到什么,就console.log出來看看吧!

        示例代碼

        // function statement
        function a(){
         console.log(this);
         this.NewVariable = "Create a new property";
        }
        a();
        console.log(NewVariable);
        var c = {
         name:"The C object",
         log: function(){
         var self = this;
         self.name = "Updated object C name";
         console.log(self);
         
         var setname = function(newname){
         self.name = newname;
         console.log(self);
         }
         setname("New name for object c");
         console.log(self)
         }
        }
        c.log();

        看完本文之后相信大家對JS中this引發(fā)的bug,都有所了解,有需要的趕緊收藏起來吧。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JS中this引發(fā)bug分析

        JS中this引發(fā)bug分析:在 js 中,this 這個上下文總是變化莫測,很多時候出現bug 總是一頭霧水,其實,只要分清楚不同的情況下如何執(zhí)行就可以了,本文主要介紹了分析JavaScript中this引發(fā)的bug以及相關的處理方法分析,希望能幫助到大家。在JavaScript中有一個很特別、很常用
        推薦度:
        標簽: js bug 分析
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 91视频免费观看| 国产亚洲精品成人久久网站 | 亚洲卡一卡二卡乱码新区| 国产高清不卡免费视频| 久久亚洲伊人中字综合精品| 亚洲精品无码永久在线观看| 美国毛片亚洲社区在线观看| 在线观看免费国产视频| 偷自拍亚洲视频在线观看| 四虎影视精品永久免费网站| 美女一级毛片免费观看| 久久亚洲精品无码观看不卡| 中文字幕成人免费高清在线视频 | 激情吃奶吻胸免费视频xxxx| 又黄又爽的视频免费看| 国产精品偷伦视频免费观看了| 亚洲中文字幕在线观看| 四虎影视成人永久免费观看视频 | 日韩吃奶摸下AA片免费观看| 亚洲中文字幕久久精品无码VA| 成年午夜视频免费观看视频| 亚洲AV香蕉一区区二区三区| 亚洲精品无码永久在线观看| 午夜免费福利小电影| 国产成人精品亚洲日本在线| 久别的草原电视剧免费观看| 亚洲白色白色在线播放| 国产成人免费ā片在线观看老同学| 亚洲成AV人片天堂网无码| 91成年人免费视频| 羞羞视频免费网站入口| 久久精品国产69国产精品亚洲| 亚欧免费视频一区二区三区| 自拍偷自拍亚洲精品偷一| 亚洲AV永久无码精品水牛影视| 国产免费毛不卡片| jyzzjyzz国产免费观看| 亚洲熟妇av一区二区三区下载| 性做久久久久免费看| 免费观看一区二区三区| 亚洲国产精品成人综合色在线|