天天看點

JavaScript中的Function對象以及arguments對象詳解

一、函數本質

  • 函數本質上就是對象,函數名指向函數對象。
function f(){
    return ;
}
var num = f();
var x = f;
           
JavaScript中的Function對象以及arguments對象詳解
  • console.log(typeof f); //function

二、建立函數(共3種方法)

  • 直接使用function關鍵字聲明新的函數
function f1(){}
           
  • 使用Function對象建立
  • 匿名函數
var f3 = function(){}
           

三、arguments對象

  • arguments屬性是一個類數組對象,每個Function對象都具有該屬性
  • arguments屬性隻在函數執行體内有效,從中可以讀取目前函數接收到的所有實參
  • 使用arguments對象可以處理可變數量的參數,進而解決JavaScript所不支援的多态性
  • 屬性:length:傳回所傳入實參的個數
function add(num1,num2){
    return num1 + num2;
}
function add(num1,num2,num3){
    return num1 + num2 + num3;
}
console.log(add());       //NaN
console.log(add(,));    //NaN
console.log(add(,,)); //60
           

由上面例子可以看出,JavaScript中不支援多态,下面用arguments來解決這個問題

function add(){
    var sum = ;
    for(var i =  ;i<arguments.length;i++){
        sum += arguments[i];
    }
    return sum;
}
console.log(add());       //10
console.log(add(,));    //30
console.log(add(,,)); //60
           

四、函數的種類

1、 标準自定義函數

  • 聲明提升(函數、變量)

2、 表達式函數

  • 傳遞性
var add = function(){
    console.log("ok");
}
var t = add ; //這裡傳遞的是記憶體位址
           
  • 本質:add是指向記憶體的指針,調用時是在指向的記憶體中把程式拿出來執行一次。

3、 嵌套函數

function a(){
    function b(){

    }
}
           
  • b()在外面不能被通路
  • 要想在外面通路b,要在程式中用return
function a(){
    function b(){

    }
    return b;
}
           

4、 匿名函數

  • function() {}

  • 隻能立即調用
  • 匿名函數不需要起名字,少占用變量;效率更高;主要用在你封閉作用域上

5、 回調函數

  • 把一個函數名作為實際參數傳遞給另外一個函數
function a(){
    console.log("hello");
}
function print(fn){
    fn();
}
print(a);  //hello
           

6、 遞歸函數

  • 自己調用自己
  • 必須有個結束條件
  • 思想:要解決一個問題,必須先解決前一個問題,直至能解決的問題
var i =  ;
function a(){
    console.log(i++);
    if(i < ){
        a();
    }
}
a();
           

7、 系統函數

  • setInterval()
  • setTimeOut()

8、 懶函數

  • 隻做一次就變化的函數
  • 用途:優化JS性能、建立對象、處理相容性……
function a(){
    console.log("hello")
    a = ;
}
a(); //hello
a();  //會報錯
           

繼續閱讀