函數(shù)2

1.異常
異常時(shí)干擾程序的正常流程的非正常事故,當(dāng)事故被查出時(shí),會(huì)拋出一個(gè)異常

var addHasError = function (a, b) {
    if (typeof a !== "number" || typeof b !== "number") {
        throw {
            name : "TypeError",
            message : "add needs number"
        }
    }
    return a + b;
}
var try_it = function () {
    try {
        addHasError("two", "one");
    } catch(ex) {
        TypeError : add needs number 
        document.writeln(ex.name + " : " + ex.message);
    }
}
try_it();

2.給類(lèi)型添加方法
JS允許給基本類(lèi)型添加方法,這樣所有的函數(shù)都可以調(diào)用

Function.prototype.method = function (name, fun) {
    // 如果添加的方法不存在,才可以添加
    if(!this.prototype[name]) {
        this.prototype[name] = fun;
        return this;
    }
}

添加一個(gè)取整的方法

Number.method("integer", function () {
    alert(this);    // this代表調(diào)用給方法的數(shù)字,這里是- 10 / 3
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
});
alert((- 10 / 3).integer());    // -3

添加一個(gè)去除字符串末端空白的方法

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

3.遞歸
遞歸函數(shù)會(huì)直接或間接的調(diào)用自身的一種函數(shù)
一個(gè)遞歸函數(shù)調(diào)用自身去解決它的子問(wèn)題
漢諾塔問(wèn)題
HTML部分

<div>
    <ul name="good">
        <p></p>
        <span name="good"></span>
    </ul>
    <ul>

    </ul>
</div>
<h1>
    <h3 name="good"></h3>
</h1>

JS部分

var hanoi = function (disc, src, aux, dst) {
    if (disc > 0) {
        arguments.callee(disc - 1, src, dst, aux);
        document.writeln("Move disc " + disc + " form " + src + " to " + dst + "<br/>");
        arguments.callee(disc - 1, aux, src, dst);
    }
}
hanoi(3, "盤(pán)子A", "盤(pán)子B", "盤(pán)子C");

調(diào)用walk_the_DOM函數(shù),它從給定的節(jié)點(diǎn)開(kāi)始,依照html的順序訪問(wèn)該樹(shù)的每個(gè)節(jié)點(diǎn)
他會(huì)調(diào)用一個(gè)函數(shù),并依次傳入每個(gè)節(jié)點(diǎn)給他
當(dāng)他調(diào)用自身時(shí),那么就會(huì)出來(lái)它的子問(wèn)題

var walk_the_DOM = function walk (node, func) {
    func(node);
    node = node.firstChild;
    while(node) {
        walk(node, func);
        node = node.nextSibling;
    }
}

定義一個(gè)getElementByAttribute方法,根據(jù)屬性查找元素

var getElementByAttribute = function (attr, value) {
    var res = [];
    walk_the_DOM(document.body, function (node) {
        var ele = node.nodeType == 1 && node.getAttribute(attr);
        alert(node.tagName);
        if(typeof ele === "string" && (ele === value || typeof value !== "string")) {
            res.push(node);
        }
    });
    return res;
}
alert(getElementByAttribute("name", "good"));
var factorial = function (i, a) {
    a = a || 1;
    if( i < 2) {
        return a;
    }
    return arguments.callee(i - 1, a * i);
}
alert(factorial(5));        // 120

4.作用域
作用域控制著參數(shù)和變量的可見(jiàn)性和生命周期

var foo = function () {
    var a = 3, b = 5;
    var bar = function () {
        var b = 7, c = 11;
        a += b + c;
        alert("a = " + a + " , b = " + b + ", c = " + c);   // a = 21 , b = 7, c = 11
    }
    alert("a = " + a + " , b = " + b);  // a = 3 , b = 5
    bar();
    alert("a = " + a + " , b = " + b);  // a = 21 , b = 5
    alert("a = " + a + " , b = " + b + ", c = " + c);   // c不存在
}();

JS不支持塊級(jí)作用域,即if、for、while等花括號(hào)中的變量,可以在外部訪問(wèn)

for(var i = 0; i < 10; i++) {}
alert(i);   // 10

5.閉包
閉包的好處在于內(nèi)部函數(shù)可以訪問(wèn)定義它的外部函數(shù)的參數(shù)和變量
且閉包的生命周期比它的外部函數(shù)要長(zhǎng)
我們是將調(diào)用函數(shù)的結(jié)果,即返回的對(duì)象賦值給myObject對(duì)象

var myObject = function () {
    var value = 0;
    return {
        increment : function (inc) {
            value = typeof inc === "number" ? inc : 1;
        },
        getValue : function () {
            return value;
        }
    };
}();
myObject.increment(10);
alert(myObject.getValue());     // 10
// 返回的對(duì)象訪問(wèn)私有屬性
// 并不需要new實(shí)例化
var quo = function (status) {
    return {
        getStatus : function () {
            return status;
        }
    }
}
// var q = quo("zhang");
// alert(q.getStatus());        // zhang
var fade = function (node) {
    var level = 1;
    var step = function () {
        var hex = level.toString(16);
        node.style.background = "#FFFF" + hex + hex;
        if (level < 16) {
            level++;
            setTimeout(step, 100);
        }
    }
    setTimeout(step, 100);
}
fade(document.body);

內(nèi)部函數(shù)能夠訪問(wèn)外部函數(shù)的變量并非復(fù)制
糟糕的例子
HTML部分

<div>
    <ul name="good">
        <p>111</p>
        <span name="good">222</span>
    </ul>
    <ul>
    3333
    </ul>
</div>
<h1>

JS部分

var ul = document.querySelectorAll("ul");
var add = function (nodes) {
    for(var i = 0; i < nodes.length; i++) {
        nodes[i].onclick = function() {
            alert(i);
        }
    }
};
add(ul);    // 你會(huì)發(fā)現(xiàn),無(wú)論你點(diǎn)擊哪一個(gè)ul都只會(huì)返回2
// 原因是閉包訪問(wèn)外部的變量是真實(shí)的并非復(fù)制的
// 像本例子中的i,它是不斷發(fā)生變化的

因此我們可以修改一下

var addClosed = function (nodes) {
    for(var i = 0; i < nodes.length; i++) {
        nodes[i].onclick = function(pos) {
            return function () {
                alert(pos);
            }
        }(i);
    }
};
// addClosed(ul);   // 這樣就ok了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容