1. 程式人生 > >Javascript function一個階段的學習總結

Javascript function一個階段的學習總結

     1.函式是物件

       在ECMAscript中,所有的函式都是function類所例項化的物件,而且都與其他引用型別一樣具有屬性和方法。函式是物件,因此函式名只是一個指向函式的指標,不會與函式繫結。也就是說一個函式可以有多個名字,這是沒問題的。

  function sum(num1,num2){
        return num1+num2
    }
    console.log(sum(12,10))

    var anotherSum = sum;
    console.log(anotherSum(10,10))

    sum = null;
    console.log(anotherSum(220,10))

     2.沒有過載

        什麼是過載

        方法過載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的引數列表,即引數的數量或引數型別不能完全相同。

        方法重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的引數表和相同的返回型別。 

        但是在ECMAScript中,函式不介意傳遞進來多少個引數,也不介意引數是什麼資料型別,也就是說,即便你定義的函式只接收兩個引數,在呼叫這個函式時也未必一定要傳遞兩個引數,可以傳遞一個、三個甚至是不傳引數。之所以會這樣,原因是ECMA中引數在內部用一個數組表示的。函式接收到的始終是這個陣列,而不關心陣列中有哪些引數。

  function addSomeNumber(num){
        return num+100;
    }
    function addSomeNumber(num,num2,num3,num4,numn){//即便這個函式的引數個數不一樣也會覆蓋上個同名函式
        return num+200;
    }
    var result = addSomeNumber(100)
    console.log("result:"+result)    //result:300

        

        

這是ECMA的一個重要特點:命名引數只是提供便利,但不是必需的。你可以建立函式的時候一個引數也不寫。

function addSomeNumber(num){
        return num+100;
    }
    function addSomeNumber(){
        return arguments[0]+200;
    }
    var result = addSomeNumber(100)
    console.log("result:"+result)

     3.作為值的函式

       因為ECMAScript中的函式本身就是變數,所以函式也可以作為值來使用。也就是說函式可以被傳遞給另一個函式當引數,

    function callSomeFunction(someFunction, someArgument) {
        return someFunction(someArgument)
    }

    function add10(num) {
        return num + 10;
    }
    var result = callSomeFunction(add10, 10);
    console.log(result);  // 20
    function getGreeting(name) {
        return "Hello," + name;
    }
    var result1 = callSomeFunction(getGreeting, 'Andy');
    console.log(result1);//  Hello,Andy

        也可以將一個函式作為另一個函式的結果返回。 這也是一種極為有用的技術。例如,假設有一個物件陣列,我們想要根據某個物件屬性對陣列進行排序。而傳遞給陣列sort()方法的比較函式要接收兩個引數,即要比較的值。可是我們需要一種方式來指明按照哪個屬性來排序。可以定義一個函式,它接收一個屬性名,然後根據這個屬性名來建立一個比較函式。

  function createComparsionFunction(propertyName) {
        return function (object1, object2) {
            var value1 = object1[ propertyName ];
            var value2 = object2[ propertyName ];
            if (value1 < value2) {
                return -1;
            }
            else if (value > value2) {
                return 1;
            }
            else {
                return 0;
            }
        };
    }

    var data = [{name:"Zachary",age:28},{name:"Nicholas",age:29}];
    data.sort(createComparsionFunction("name"));
    console.log(data[0].name);
    data.sort(createComparsionFunction("age"));
    console.log(data[0].age);

     4.函式內部的屬性

       arguments、this

       arguments是一個類陣列物件(陣列的弟弟),包含著傳入函式中的所有引數。                         https://blog.csdn.net/qq_16339527/article/details/53231725←我抄他的= _=

       arguments的callee屬性:儲存著這個arguments所在函式的程式碼

    function showcallee() {
        var a = '這裡是程式碼';
        var b = '這是另一段程式碼';
        var c = a + b;

        console.log(arguments.callee);

        return c;
    }
    showcallee();

       this是引用當前函式的執行環境 高程三p114

     5.函式的屬性和方法

       每個函式都包含兩個屬性:length和prototype

       每個函式都包含兩個非繼承而來的方法:apply和call

https://blog.csdn.net/weixin_42519137/article/details/83823855

     6.閉包