標籤:val 代碼 apply span ret 指標 調用 alert type屬性
函數本質就是功能的集合
JS中函數是對象,因此,函數名實際上僅僅是一個指向函數對象的指標,不會與某個函數綁定,所以,JS中沒有重載(重載就是通過傳遞不同類型的參數,使兩個相同函數名的函數執行不同的功能)
var fn=function(a){return a+100;}fn=function(a){return a+200;}alert(fn(100)); //300
要訪問函數的引用(指標)而不是執行函數時,必須去掉圓括弧,加上圓括弧表示訪問函數執行後的結果
函數體內部的語句在執行時,一旦遇到return,函數就會結束(後面的代碼不會執行),並返回傳回值
傳回值可以是任何類型的值,如果沒有return或只有return而沒有傳回值,則函數返回預設值undefined
在函數內部,有兩個特殊的對象arguments和this
a.arguments是一個類似數組(但不是數組)的對象,用於儲存函數的參數,即使函數定義時沒有定義參數,arguments也會儲存實際調用時使用的參數
b.this表示當前函數執行的環境對象的引用
function fn(){return this;}fn();
函數擁有兩個屬性length和prototype
a.length表示希望接收的參數個數,而不是實際接收的
b.prototype儲存了參考型別的所有執行個體方法(tostring(),valueOf()等等),在ES5中,prototype屬性是無法枚舉的
函數擁有兩個非繼承而來的方法apply()和call(),這兩個方法的作用都是在特定的範圍中調用函數實際上等於設定函數體內this對象的值
a.apply()方法可以接收兩個參數,一個是在其中運行函數的範圍,另一個時參數數組(可以沒有),參數數組可以是Array的執行個體,也可以是arguments對象
b.call()方法和apply()方法作用相同,但接收參數的方式不同,call()第二個參數只能是函數參數的數組形式,也就是說第二個參數必須一個一個列出來
這兩個方法常用來擴充範圍
function fn1(a,b){return a+b;}function fn2(a,b){return fn1.apply(this,arguments);}alert(fn1(1,1)); //2alert(fn2(1,1)); //2
function fn1(a,b){return a+b;}function fn2(a,b){return fn1.apply(this,[a,b]);}alert(fn1(1,1)); //2alert(fn2(1,1)); //2
fn.call(window); //fn在全域環境中執行fn.call(this); //fn在當前環境中執行
ES5中還定義了一個方法bind(),這個方法會創造一個函數的執行個體,其this值會被綁定到傳給bind()方法的值
window.color=‘red‘;var p={color:‘blue‘};function fn(){alert(this.color);}var fn0=fn.bind(p);fn0(); //blue
對JS中函數的理解