• <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語(yǔ)言精粹

            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問(wèn)題,遞歸求解
            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');


            // 遞歸處理瀏覽器端的文檔對(duì)象模型
            //
             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

            // 通過(guò)調(diào)用函數(shù)的形式初始化myObject
            //
             該函數(shù)返回一個(gè)包含有2個(gè)方法的對(duì)象,并且這些方法享有繼續(xù)訪問(wèn)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)建一個(gè)名為quo的構(gòu)造函數(shù). 它構(gòu)造出帶有g(shù)et_status方法和status私有屬性的一個(gè)對(duì)象。
            var quo = function(status){
                
            return {
                    get_status: 
            function(){
                                    
            return status;
                    }
                };
            };
            var myQuo = quo("amazed");
            document.writeln(myQuo.get_status());

            // 定義一個(gè)函數(shù),它設(shè)置一個(gè)DOM節(jié)點(diǎn)為黃色,然后把它變成白色
            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ù)或計(jì)算表達(dá)式
                    }
                };
                setTimeout(step, 
            100);
            };
            fade(document.body);


            // 給一個(gè)數(shù)組中的節(jié)點(diǎn)設(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字符,并替換為它們對(duì)應(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());

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

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

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久亚洲精品人成综合网| 亚洲精品国产综合久久一线| 欧美噜噜久久久XXX| 久久99精品久久久久久动态图| 久久精品国产精品亚洲艾草网美妙| 亚洲va国产va天堂va久久| 久久国产香蕉视频| 午夜不卡久久精品无码免费| 国产精品久久久久无码av| 久久99国产综合精品女同| 国产精品成人99久久久久91gav| 久久成人国产精品二三区| 久久亚洲精品国产精品| 久久精品国产清自在天天线| 久久久久久毛片免费播放| 日本强好片久久久久久AAA| 9999国产精品欧美久久久久久 | 国内精品久久久久久久涩爱| 国产精品久久久久jk制服| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久青草青青亚洲国产免观| 精品无码久久久久国产| 婷婷久久综合| 久久综合综合久久97色| 久久久无码精品亚洲日韩按摩| 亚洲а∨天堂久久精品| 久久综合精品国产一区二区三区| 久久综合给合综合久久| 国产精品久久久久久久午夜片| 91精品国产综合久久精品| 久久亚洲sm情趣捆绑调教| 亚洲AV无码一区东京热久久| 午夜精品久久久久久影视777 | 国产产无码乱码精品久久鸭| 久久久久久久久66精品片| 久久国产色AV免费观看| 精品国产乱码久久久久久人妻| 久久亚洲私人国产精品vA | 国产精品久久久香蕉| 久久久国产视频| 777午夜精品久久av蜜臀|