JavaScript Function函數(shù)類型介紹

字號:


    // 在JS中,Function(函數(shù))類型實際上是對象;每個函數(shù)都是Function類型的實例;而且都與其他引用類型一樣具有屬性和方法;
    // 由于函數(shù)是對象,因此函數(shù)名實際上也是一個指向函數(shù)對象的指針;
    一 函數(shù)的聲明方式
    1.函數(shù)聲明方式
    function box(num1,num2){
    return num1+num2;
    }
    2.函數(shù)表達式定義函數(shù)
    var box = function(num1,num2){// 通過變量box即可引用函數(shù);
    return num1+num2;
    };// 注意函數(shù)末尾有一個分號,就像聲明其他變量時一樣;
    var another = box; // 使用不帶圓括號的函數(shù)名是訪問函數(shù)指針;而非調(diào)用函數(shù);
    console.log(another(10,10));
    3.使用Function構(gòu)造函數(shù)
    var box = new Function('num1','num2','return num1+num2');
    // 第三種方式不推薦,這種語法會導(dǎo)致解析兩次代碼(第一次解析常規(guī)JS代碼,第二次解析傳入構(gòu)造函數(shù)中的字符串),從而影響性能;
    // 可以通過這種語法來理解"函數(shù)是對象,函數(shù)名是指針"的概念;
    二 作為值的函數(shù)
    // JS中的函數(shù)名本身就是變量,所以函數(shù)也可以作為值來使用;
    // 也就是說,不僅可以像傳參數(shù)一樣把一個函數(shù)傳遞給另一個函數(shù),而且可以將一個函數(shù)作為另一個函數(shù)的結(jié)果返回;
    function box(sumFunction,num){// 無論第一個參數(shù)傳遞進來的是什么函數(shù),
    return sumFunction(num); // 它都會返回執(zhí)行第一參數(shù)后的結(jié)果;
    }
    function sum(num){
    return num+10;
    }
    // 傳遞函數(shù)到另一個函數(shù)里;
    // 要訪問函數(shù)的指針不執(zhí)行函數(shù)的話,須去掉函數(shù)名后的圓括號;
    var result = box(sum,10); // =>20;
    三 函數(shù)內(nèi)部屬性
    // 函數(shù)內(nèi)部有兩個特殊的對象:arguments和this;
    // 1.arguments:是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù),主要用途是保存函數(shù)參數(shù);
    // arguments這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數(shù);
    function box(num){
    if(num<=1){
    return 1;
    }else{
    return num*arguments.callee(num-1); // 使用arguments.callee來執(zhí)行box本身;
    }
    }
    // 2.this:引用的是函數(shù)據(jù)以操作的對象,或者說函數(shù)調(diào)用語句所處的作用域;
    // 當在全局作用域調(diào)用函數(shù)時,this對象引用的就是window;
    window.color = "red";
    alert(this.color); // 打印全局的color;=>red;
    var box = {
    color:'blue',
    sayColor:function(){
    alert(this.color); // 打印局部的color;=>blue;
    }
    };
    四 函數(shù)屬性和方法
    // JS中的函數(shù)是對象,因此函數(shù)也有屬性和方法;包含length和prototype;
    // length屬性:表示函數(shù)希望接收到命名參數(shù)的個數(shù);
    function box(name,age){
    alert(name+age);
    }
    alert(box.length); // 2s
    // prototype屬性:它是保存所有實例方法的真正所在,也就是原型;
    // prototype包含兩個方法:apply()和call(),每個函數(shù)都包含這兩個非繼承而來的方法;
    // 這兩個方法的用途都在特定的作用域中調(diào)用函數(shù),實際上等于設(shè)置函數(shù)體內(nèi)this對象的值;
    var color = 'red';
    var box = {
    color = 'blue';
    }
    function sayColor({
    alert(this.color);
    });
    sayColor(); // 作用域在window;
    sayColor.call(this); // 作用域在window;
    sayColor.call(window); // 作用域在window;
    sayColor.call(box); // 作用域在box,對象冒充;=>red;
    // 使用call(box)方法的時候,sayColor()方法的運行環(huán)境已經(jīng)變成了box對象里了;
    // 使用call()或apply()來擴充作用域的最大好處,就是對象不需要與方法發(fā)生任何耦合關(guān)系;
    // 耦合:相互關(guān)聯(lián)的意思,擴展和維護會發(fā)生連鎖反應(yīng);
    // 也就是說,box對象和sayColor()方法之間不會有多余的關(guān)聯(lián)操作,比如:box.sayColor = sayColor;
    function Animal(){
    this.name = "Animal";
    this.showName = function(){
    alert(this.name);
    }
    }
    function Cat(){
    this.name = "Cat";
    }
    var animal = new Animal();
    var cat = new Cat();
    //通過call或apply方法,將原本屬于Animal對象的showName()方法交給對象cat來使用。
    //輸入結(jié)果為"Cat"
    animal.showName.call(cat,",");
    //animal.showName.apply(cat,[]);
    五 小結(jié)
    1 // 函數(shù)實際上是Function類型的實例,因此函數(shù)也是對象;而這一點正式JavaScript最有特色的地方;
    2 // 由于函數(shù)對象,所以函數(shù)也擁有方法,可以用來增強其行為;