《javascript高級程序設計》筆記:Function類型

這麼長時間沒有寫博客,就是由於函數這部分比較麻煩,本身一直想抽出大把的時間來研究這個,但是結果倒是一拖再拖,這樣很差。有時間就寫纔是王道啊,否則這計劃得一直卡在這裏了..javascript

1. 幾個概念

函數:將代碼進行封裝, 複用的邏輯單元(代碼)
對象:無序鍵值對的集合
數組:有序鍵值對的集合, 數組的索引號就是鍵
屬性:對象屬性的值是一個普通的數據
方法:對象的屬性是一個函數
對象的成員:包括屬性和方法java

另外關於函數,你應該時刻記住的是:函數也是對象,函數名是一個指向函數對象的指針。所以,函數也能夠做爲參數傳遞面試

2. 函數的三種建立方式

2.1 函數表達式

標準語法:segmentfault

var fn = function(){}; // 只能在聲明以後調用

有一種寫法也須要注意,可能在面試題中會遇到:數組

var fn = function fn1(){}; // 不會報錯

有這樣一個例子,可以很好的區分兩種寫法的差別函數

// 標準寫法
var fn = function(){
    console.log(fn); // function (){ console.log(fn) }
};
fn();
console.log(fn); // function (){ console.log(fn) }

// 非主流寫法
var fn1 = function fn2() {
    console.log(fn1);
    console.log(fn2);
}
fn1();
console.log(fn1);
console.log(fn2);

爲了更有說服力,我直接上圖吧!this

clipboard.png

結論
函數表達式聲明方式中,function後面也能夠添加函數名,但僅能在函數內部使用spa

2.2 函數聲明

語法:3d

function fn(){}; // 可以在做用域下的任何地方使用

2.3 構造函數聲明

語法:指針

var fn = new Function(param1, param2, body)

Function構造函數能夠接受任意數量的參數,但最後一個參數始終被看作函數體,至關於一個小型的js編譯器(執行效率低)

var fn = new Function(num1, num2, 「return num1+num2」);
// 等價於
function fn(num1, num2) {
    return num1 + num2;
}
// 或
var fn = function(num1, num2) {
    return num1 + num2;
}

2.3 函數聲明和函數表達式的區別

1 函數聲明會把整個函數體提高到最前面function fn() {},所以調用的位置沒有前後之分;函數表達式只會把函數名字提高var fn = function() {}; 此時函數做爲數據,所以必須先聲明後使用

2 函數聲明不可以出如今其餘語句塊中!函數聲明可以出現的位置: 全局環境中其餘函數內部

我的建議:從代碼可維護性出發,儘可能使用函數表達式的方式來聲明函數

3. 函數內部屬性

1.name屬性

函數名.name => 獲取字符串類型的函數名稱

// 外部
function fn1(){};
console.log(fn1.name); // fn1
// 內部
function fn2() {
    console.log(fn2.name); // fn2
}
fn2();

2.length屬性

函數名.length => 獲取形參的個數,未傳參時返回0

// 外部
function fn1(a,b){};
console.log(fn1.length); // 2
// 內部
function fn2(a,b,c) {
    console.log(fn2.length); // 3
}
fn2();

3.caller屬性

函數名.caller => 得到調用函數的函數引用(函數在哪被調用),若是在全局中調用當前函數,值爲null

var inner = function() {
    alert(inner.caller);
};
var outer = function() {
    inner();
};
outer(); // function() { inner(); };
inner(); // null

4.arguments屬性

arguments只能在函數內部使用,用來獲取傳入的實參。是一個僞數組

其內部有以下屬性:
arguments.length:獲取實參的個數
arguments.callee:獲取當前函數的引用,通常用在匿名函數遞歸中

// 階乘
function factorial(num) {
    if(num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num - 1);
    }
}

5.this屬性

this會在下一篇博客中詳細講解,先記住一句話:
this的指向和函數執行的環境相關,與它聲明的環境無關

4.函數的形參和實參

形參:函數聲明時的參數,起佔位做用——函數名.length(形參個數)
實參:函數調用時的參數,實際參與運算的值—arguments.length(實參個數)

當形參個數大於實參時,多餘的形參將設置成undefined
當實參個數大於形參時,沒法直接得到全部的實參,經過arguments得到實參

參數傳遞的理解:形參至關於一個具備局部做用域不須要聲明的和實參指向相同堆地址對象的值,其類型與實參相同

相關文章
相關標籤/搜索