Javascript漂流記(上)__this、克隆

一、this(粗糙的說,平時指向window,後期誰調用就指誰)
    1、函數預編譯時。this --> window

        function test(){
            console.log(this);//window
        }
        test();

    2、全局作用域裏this --> window
    3、call/apply可以改變this指向,詳解參考上節課堂筆記
    4、在obj.func()裏, func()裏面的this指向obj

        var obj = {
            a : function(){
                console.log(this.name);
            },
            name : 'abc'
        }
        obj.a();

    補充知識點:

    1. 前面講到立即執行函數不具備名稱,如果想遞歸調用,函數引用寫什麼呢?arguments.callee就派上用場了。

        var num = (function(n){
            if(n == 1){
                return 1;
            }
            return n * arguments.callee(n-1);
        }(100));

    2.還有一位叫func.caller(用處不大,但時而會和arguments.callee一起考。ES5標準模式下會報錯)

        function test(){
            demo();
        }
        function demo(){
            console.log(demo.caller);//打印test。demo在哪兒執行,它的caller就是哪兒
        }
        test();

    3.三目運算符:條件判斷?是:否,並且會返回值

        var num = 1 > 0 ? 2 + 2 : 1 + 1;
        var num = 1 > 0 ? ("10" > "9" ? 1 : 0) : 2; 

二、克隆:分爲淺克隆和深克隆

       1、淺克隆。能夠完成克隆,但克隆體obj1的屬性改變會聯動obj同時改變。並不是我們想要的結果。代碼如下:

        var obj = {
            name : 'abc',
            age : 123,
            gender : 'male',
            card : {
                card1 : 'visa',
                card2 : 'master'
            }
        };
        var obj1 = {};
        function clone(origin, target){
            var target = target || {};//容錯,防止用戶不傳target
            for(var prop in origin){
                target[prop] = origin[prop];
            }
            return target;
        }
        clone(obj, obj1);

    
        2、深克隆。引用值只考慮數組和對象。先判斷obj屬性的值類型,過濾出object類型(null也需要考慮到),使用toString方法區分數組和對象,遞歸調用原函數。

            var obj = {
                name : 'abc',
                age : 123,
                gender : 'male',
                card : {
                    card1 : 'visa',
                    card2 : 'master'
                }
            };
            var obj1 = {};
            function deepClone(origin, target){
                var target = target || {},//容錯,以防用戶沒有傳target參數
                    toStr = Object.prototype.toString,//instanceof和constructor在父子域那塊兒有問題
                    arrStr = "[object Array]";
                for(var prop in origin){
                    if(origin.hasOwnProperty(prop)){
                        if(typeof(origin[prop] !== 'null' && origin[prop]) == 'object'){
                            // if(toStr.call(origin[prop]) == arrStr){
                            //     target[prop] = [];
                            // }else{
                            //     target[prop] = {};
                            // }
                            target[prop] = (toStr.call(origin[prop]) == arrStr) ? [] : {};			
                            deepClone(origin[prop], target[prop]);
                        }else{
                            target[prop] = origin[prop];
                        }
                    }	
                }
                return target;
            }
            deepClone(obj, obj1);

以上內容屬二哥原創,整理自 "渡一教育Javascript課程" ,一個值得推薦的"渡一教育"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章