• <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 函數(shù)
            ///////////// 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 什么關(guān)系?
            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不能做尾遞歸優(yōu)化。
            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

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

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

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

            // 定義一個函數(shù),它設(shè)置一個DOM節(jié)點為黃色,然后把它變成白色
            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()方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計算表達(dá)式
                    }
                };
                setTimeout(step, 
            100);
            };
            fade(document.body);


            // 給一個數(shù)組中的節(jié)點設(shè)置事件處理程序
            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字符,并替換為它們對應(yīng)的字符
            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());

            // 返回一個用來產(chǎn)生唯一字符串的對象
            // 唯一字符串由兩部分組成:前綴+序列號
            // 該對象包括一個設(shè)置前綴的方法,一個設(shè)置序列號的方法,和一個產(chǎn)生唯一字符串的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構(gòu)造器產(chǎn)生的函數(shù)對象會運行類似這樣的一些代碼:”。主語都錯了。這本書里的錯誤確實比較多。

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

            導(dǎo)航

            統(tǒng)計

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            国产精品久久久久久福利漫画 | 亚洲伊人久久综合中文成人网| 久久精品无码一区二区三区免费| 国内精品久久久久久久久电影网| 久久久99精品成人片中文字幕 | 色青青草原桃花久久综合| 青青国产成人久久91网| AV无码久久久久不卡网站下载| 亚洲va久久久噜噜噜久久男同 | 精品人妻伦九区久久AAA片69| 久久综合视频网| 久久国产精品波多野结衣AV| 久久精品黄AA片一区二区三区| 久久美女网站免费| 欧美一区二区精品久久| 国产精品九九久久免费视频 | 精品一久久香蕉国产线看播放| 国产精品久久久天天影视香蕉| 精品国产一区二区三区久久蜜臀| 精品久久一区二区| 久久青草国产精品一区| 99久久精品免费看国产一区二区三区| 亚洲综合久久综合激情久久 | 91麻豆精品国产91久久久久久| 国产成人精品久久综合| 久久久久国产成人精品亚洲午夜| 日韩亚洲国产综合久久久| 久久久久久精品久久久久| 亚洲精品午夜国产VA久久成人| 国产精品美女久久久免费| 久久婷婷五月综合色奶水99啪| 久久精品国产第一区二区三区 | 国产精品岛国久久久久| 国内精品免费久久影院| 99久久综合国产精品免费| 亚洲精品无码久久久影院相关影片| 99久久精品久久久久久清纯| 亚洲精品成人网久久久久久| 久久久久综合网久久| 久久久99精品一区二区| 久久人人爽人人爽人人AV |