• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            javascript語言精粹

            ch04 函數
            ///////////// Function Literal

            var add = function (a,b){
                
            return a + b;
            }

            ///////////// Invocation

            // The Method Invocation Pattern

            var myObject = {
                value: 
            0,
                increment: 
            function (inc) {
                    
            this.value += typeof inc === 'number' ? inc : 1;
                }
            };

            myObject.increment();
            document.writeln(myObject.value);

            myObject.increment(
            2);
            document.writeln(myObject.value);

            // The Function Invocation Pattern

            var sum = add(34);

            myObject.
            double = function(){
                
            var that = this// Workaround

                
            var helper = function(){
                    that.value 
            = add(that.value, that.value)
                };

                helper();
            };

            // Invoke double as a method.

            myObject.
            double();
            document.writeln(myObject.value);

            // The Constructor Invocation Pattern

            var Quo = function(string){
                
            this.status = string;
            };

            Quo.prototype.get_status 
            = function(){
                
            return this.status;
            };

            var myQuo = new Quo("confused");
            document.writeln(myQuo.get_status());

            // The Apply Invocation Pattern

            var array = [34];
            var sum = add.apply(null, array);

            var statusObject = {
                status: 'A
            -OK'
            };

            var status = Quo.prototype.get_status.apply(statusObject);

            //////////////// Arguments

            var sum = function(){
                
            var i, sum = 0;
                
            for(i = 0; i < arguments.length; i += 1){
                    sum 
            += arguments[i];
                }
                
            return sum;
            };

            document.writeln(sum(
            4815162342));



            ////////////////// 4.6 Exceptions

            var add = function(a, b){
                
            if(typeof a !== 'number' || typeof b !== 'number'){
                    
            throw{
                        name: 'TypeError',
                        message: 'add needs numbers'
                    }
                }
                
            return a + b;
            }

            var try_it = function(){
                
            try{
                    add(
            "seven");
                }
            catch(e){
                    document.writeln(e.name 
            + ': ' + e.message);
                }
            }

            try_it();


            /////////////// 4.7 Argumenting Types

            // TODO
            Function.prototype.method = function(name, func){
                
            this.prototype[name] = func;
                
            return this;
            };


            Number.method('integer', 
            function(){
                    
            return Math[this < 0 ? 'ceil' : 'floor'](this);
            });
            document.writeln((
            -10 / 3).integer());


            String.method('trim', 
            function(){
                    
            return this.replace(/^\s+|\s+$/g, '');
            });
            document.writeln('
            "' + "      neat       ".trim() + '"');


            Function.prototype.method 
            = function(name, func){
                
            if(!this.prototype[name]){
                    
            this.prototype[name] = func;
                }
            };

            /////////////////// 4.8 Recursion

            // hanoi問題,遞歸求解
            var hanoi = function(disc, src, aux, dst){
                
            if(disc > 0){
                    hanoi(disc 
            - 1, src, dst, aux);
                    document.writeln('Move disc ' 
            + disc + ' from ' + src + ' to ' + dst);
                    hanoi(disc 
            - 1, aux, src, dst);
                }
            }
            hanoi(
            3, 'Src', 'Aux', 'Dst');


            // 遞歸處理瀏覽器端的文檔對象模型
            //
             TODO wark_the_DOM 和 walk 什么關系?
            var wark_the_DOM = function walk(node, func){
                func(node);
                node 
            = node.firstChild;
                
            while(node){
                    walk(node, func);
                    node 
            = node.nextSibling;
                }
            };

            var getElementsByAttribute = function(att, value){
                
            var results = [];

                wark_the_DOM(document.body, 
            function(node){
                        
            var actual = node.nodeType === 1 && node.getAttribute(att);
                        
            if(typeof actual === 'string' &&  // node屬性是string,node值等于傳入的value,或者value不是string
                            (actual === value || typeof value !== 'string')){
                        results.push(node);
                        }
                        });
            };


            // 尾遞歸求階乘。js不能做尾遞歸優化。
            var factorial = function factorial(i, a){
                a 
            = a || 1;
                
            if(i < 2){
                    
            return a;
                }
                
            return factorial(i - 1, a * i);
            };
            document.writeln(factorial(
            4));


            //////////////// Scope

            var foo = function(){
                
            var a = 3, b = 5;
                
            var bar = function(){
                    
            var b = 7, c = 11;
                    a 
            += b + c;
                };
                bar();
            };
            foo();


            ////////////// Closure

            // 通過調用函數的形式初始化myObject
            //
             該函數返回一個包含有2個方法的對象,并且這些方法享有繼續訪問value變量的特權
            var myObject = function(){
                
            var value = 0;

                
            return {
                    increment: 
            function(inc){
                        value 
            += typeof inc === 'number' ? inc : 1;
                    },
                    getVaule: 
            function(){
                        
            return value;
                    }
                }
            }(); 
            // 立刻執行

            // 創建一個名為quo的構造函數. 它構造出帶有get_status方法和status私有屬性的一個對象。
            var quo = function(status){
                
            return {
                    get_status: 
            function(){
                                    
            return status;
                    }
                };
            };
            var myQuo = quo("amazed");
            document.writeln(myQuo.get_status());

            // 定義一個函數,它設置一個DOM節點為黃色,然后把它變成白色
            var fade = function(node){
                
            var level = 1;
                
            var step = function(){
                    
            var hex = level.toString(16);
                    node.style.backgroundColor 
            = '#FFFF' + hex + hex; // TODO 顏色編碼
                    if(level < 15){
                        level 
            += 1;
                        setTimeout(step, 
            100); // setTimeout()方法用于在指定的毫秒數后調用函數或計算表達式
                    }
                };
                setTimeout(step, 
            100);
            };
            fade(document.body);


            // 給一個數組中的節點設置事件處理程序
            var add_the_handles = function(nodes){
                
            var i;
                
            for(i = 0; i < nodes.length; i+=1){
                    node[i].onclick 
            = function(i){
                        
            return function(e){
                            alert(e);
                        };
                    }(i);
                }
            };
            add_the_handles(document.body);

            ///////////// Module

            // 尋找字符串中的HTML字符,并替換為它們對應的字符
            String.method('deentityify',function(){
                
            // The entity table. Itmaps entity names to characters.
                var entity= {
                    quot: '
            "',
                    lt: '<',
                    gt: '>'
                };

                // Return the deentityify method.
                return function(){
                    return this.replace(/&([^&;]+);/g, // TODO 正則
                        function(a, b){
                            var r = entity[b];
                            return typeof r === 'string' ? r : a;
                        })
                };
            }());
            document.writeln('&lt;&quot;&gt;'.deentityify());

            // 返回一個用來產生唯一字符串的對象
            // 唯一字符串由兩部分組成:前綴+序列號
            // 該對象包括一個設置前綴的方法,一個設置序列號的方法,和一個產生唯一字符串的gensym方法
            var serial_maker = function(){
                var prefix = '';
                var seq = 0;
                return {
                    set_prefix: function(p){
                                    prefix = String(p);
                                },
                    set_seq: function(s){
                                 seq = s;
                             },
                    gensym: function(){
                                var result = prefix + seq;
                                seq += 1;
                                return result;
                            }
                };
            };
            var seqer = serial_maker();
            seqer.set_prefix('Q');
            seqer.set_seq(1000);
            var unique = seqer.gensym();
            document.writeln(unique);

            /////////////// Curry

            Function.method('curry', function(){
                var slice = Array.prototype.slice;
                args = slice.apply(arguments);
                that = this;
                return function(){
                    return that.apply(null, args.concat(slice.apply(arguments)));
                };
            });

            var add1 = add.curry(1);
            document.writeln(add1(6));

            ////////////// Memoization

            // Fibonacci, beform memoization
            var fibonacci = function(n){
                return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
            };

            for(var i = 0; i <= 10; i += 1){
                document.writeln('//' + i + ': ' + fibonacci(i));
            }

            // after memoization
            var fibonacci2 = function(){
                var memo = [0, 1];
                var fib = function(n){
                    var result = memo[n];
                    if(typeof result !== 'number'){
                        result = fib(n - 1) + fib(n - 2);
                        memo[n] = result;
                    }
                    return result;
                };
                return fib;
            }();
            for(var i = 0; i <= 10; i += 1){
                document.writeln('//' + i + ': ' + fibonacci2(i));
            }

            var memoizer = function(memo, fundamental){
                var shell = function(n){
                    var result = memo[n];
                    if(typeof result !== 'number'){
                        result = fundamental(shell, n);
                        memo[n] = result;
                    }
                    return result;
                };
                return shell;
            };

            var fabonacci3 = memoizer([0,1], function(shell, n){
                    return shell(n - 1) + shell(n - 2);
            });

            var factorial2 = memoizer([1,1], function(shell, n){
                    return n * shell(n - 1);
            });

            ch05 繼承

            5.1 偽類

            吐下槽。"the Function constructor that produces the function object runs some code like this:"被譯成了“Function構造器產生的函數對象會運行類似這樣的一些代碼:”。主語都錯了。這本書里的錯誤確實比較多。

            posted on 2011-09-04 21:41 小默 閱讀(393) 評論(0)  編輯 收藏 引用 所屬分類: Language

            導航

            統計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            久久亚洲精品成人av无码网站| 久久黄视频| 狠狠色综合网站久久久久久久高清| 日韩一区二区久久久久久| 久久久久人妻一区精品性色av| 亚洲狠狠婷婷综合久久蜜芽| 久久亚洲中文字幕精品有坂深雪 | 1000部精品久久久久久久久| 精品久久久久久无码专区| 大伊人青草狠狠久久| 91麻豆精品国产91久久久久久| 一本色道久久88加勒比—综合| 精品久久久无码中文字幕| 亚洲国产成人精品无码久久久久久综合| 久久久精品日本一区二区三区 | 91精品久久久久久无码| 开心久久婷婷综合中文字幕| 久久久一本精品99久久精品88| 精品久久人妻av中文字幕| 久久久久久国产a免费观看不卡| 天天躁日日躁狠狠久久| 精品久久久久久久中文字幕| 久久久久青草线蕉综合超碰| 国产精品久久影院| 老男人久久青草av高清| 日本道色综合久久影院| 亚洲国产另类久久久精品| 污污内射久久一区二区欧美日韩| 久久亚洲中文字幕精品有坂深雪 | 久久婷婷国产剧情内射白浆| 久久国产一区二区| 久久精品一本到99热免费| 麻豆久久| 97久久精品人人澡人人爽| 亚洲狠狠婷婷综合久久蜜芽| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久性生大片免费观看性| 亚洲国产成人久久综合一| 久久精品国产亚洲AV大全| 国产欧美久久久精品影院| 久久午夜免费视频|