js調試系列: 調試基礎與技巧


js調試系列目錄:
-

    昨天我們見識到了斷點的強悍,在斷點的配合下進行動態調試,讓讀代碼變的輕松不少,特別是ajax之類的。
    在昨天的課后練習中,確實增加了不少難度,因為 提交評論 按鈕是用 jQuery 綁定的事件。
    所以不能直接在元素上看到函數調用,也沒辦法一下子定位到函數源碼處。
    如果找不到源碼位置,我們就沒法下斷點進行動態調試了。
    我們來做下昨天的練習吧,先找到他的事件源碼。

    沒發現任何有價值的東西,只是一個很普通的節點而已。。
    如果不是通過 onclick 綁定是函數,我們沒法直接找到他的源碼處,那怎么辦?
    好在他用的是 jQuery, 我們根據《淺談 jQuery 事件源碼定位問題》可知,只要調用如下代碼即可獲得事件了。

    function lookEvents (elem) {
        return $._data ? $._data( elem, "events" ) : $.data( elem, "events", undefined, true );
    }
    var event = lookEvents($("#btn_comment_submit")[0]); // 獲取綁定的事件


    經過代碼格式化后,定位到如下源碼處。

    可是很明顯,這個不是真正的源碼,只是在 click 事件里調用了 commentManager.postComment 方法而已。
    所以繼續定位。

    進入472行發現如下代碼

    this.postComment = function() {
        $("#btn_comment_submit").val()=="修改" && $("#comment_edit_id").html != "" ?commentManager.UpdateComment():commentManager.PostNewComment()
    };

    很明顯,也不是我們要的最終代碼,不過這個也非常重要,他是根據按鈕值來進行提交的。
    如果是 修改 按鈕,就執行 UpdateComment 方法,否則就執行 PostNewComment 方法。
    我們應該繼續跟入 commentManager.PostNewComment 方法,走起。。

    最終定位到 478 行出,這就是提交評論的按鈕代碼了,我們就里就不分析了,感興趣的童鞋自己去讀代碼吧。
    第二題 2. 動態調試這個 提交評論 事件的執行過程。
    我們也不做了,源碼找到了,根據昨天的步驟,自己去動態調試一遍試試。一定要動手練習一下,否則會秒忘的。
    正如之前所說,如果看看就會了,那我們每個人都會是高考狀元不是么。。所以還是要動手練。

    我們進入今天的正題,debugger 斷點。
    這是什么東西呢?
    字面翻譯叫做 調試器,其實就是代碼斷點而已,用法非常簡單,在你寫代碼的時候,想要斷點調試的地方寫上 debugger 即可。
    如:

    var a, b, c;
    debugger;
    a = 11;
    b = 22;
    c = a + b;
    console.log(c);

    現在你點擊代碼右上角的 運行 按鈕試試,看到一個彈層輸出 33,斷點沒有斷下,斷點壞掉了?
    其實是因為你沒開控制台,打開控制台后,再點擊 運行按鈕試試。發現已經斷下了,停在如下代碼處。

    可能你覺得,我直接在控制台點下行號下斷點不是一樣么,為什么要用debugger呢?
    剛才調試jQuery事件的時候,你也發現了,非常麻煩,當然如果是你自己寫的項目找源碼可能比較簡單,
    但是再簡單也比不過直接在源碼加上debugger方便啊。
    特別是各種回調的時候就是 debugger 大顯身手的時候。

    好了,我們來看個綜合調試練習吧。

    (function(){ // 為了獨立作用域
        function add(a, b) {
            return a + b;
        }
        debugger;
        var sum = 0;
        for (var i=0; i<10; i++) {
            sum += add(i, 1);
        }
    
        console.log(sum);
    })();

    為了獨立作用域,我加了個自調用函數。


    如果不加 自調用函數,add, i, sum 變量就會在 Global 下,你可以點開 Global 看看里面都有些什么。
    加了個自調用函數就可以非常清晰的調試我們的代碼了,所以變量都在 Local 下。
    我們來看右上角的調試按鈕

    前四個按鈕最重要,一定要記住他們的功能,后面兩個按鈕暫時不管。。

    快捷鍵 功能
    F8 恢復運行
    F10 步過,遇到自定義函數也當成一個語句執行,而不會進入函數內部
    F11 步入,遇到自定義函數就跟入到函數內部
    Shift + F11 步出,跳出當前自定義函數

    我們分別來試試這些按鈕的功能。
    運行下面代碼,停在了 debugger 斷點處。

    (function() { // 為了獨立作用域
        function add(a, b) {
            a = a + a;
            b = b + b
            return a + b;
        }
        debugger;
        var sum = 0;
        for (var i = 0; i < 10; i++) {
            sum += add(i, 1);
        }
        debugger;
        console.log(sum);
    })();

    我們按下 F8 看看會發生什么。
    發現他停在了下一個 debugger 處,所以說 F8 是 恢復運行,但是遇到斷點會繼續停下。
    我們重新運行代碼還是停在第一個 debugger 處,來按下 F10,一直按。
    會發現在 for 那里會來回跳,因為這里是循環啊。。
    改按 F11 試試,你會發現執行  sum += add(i, 1);  的時候會跳到 add 函數內部代碼處。
    所以,我們可以知道,F10 不會進入自定義函數內部,而 F11 會進入。
    就也是很多新人在調試 jQuery 代碼的時候老是遇到的一個問題。
    比如:

    debugger;
    var digg_count = $('#digg_count').html();
    console.log('本篇推薦數為', digg_count);

    運行后,當你按 F11,就會進入到 jQuery 庫代碼內部,然后你調試,越痛苦,都不知道自己在哪了。
    其實方法非常簡單,不小心進入到你不知道或者不想調試的函數內部時,按鈕 Shift + F11 即可退回到剛才調用函數的地方。
    你可以試試,當你調試這個代碼的時候,不小心進入到 jQuery 內部,然后按 Shift + F11 就會到剛才那個地方,並且函數已經執行完畢了。

    好了今天的內容差不多就這些了,可能感覺有點亂,今天寫的比較遲,沒有梳理好思路,大家將就這看吧。


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM