3、JavaScript函數
知識點函數定義 函數調用 傳參 函數的傳回值 變數的範圍 匿名函數 回呼函數 自調函數 內嵌函數 遞迴調用 閉包函數定義
來看下面的代碼。
function print(){ console.log('123');}
上面的代碼定義了一個函數
- function 定義函數的關鍵字
- print 函數名
- {} {}中的內容為函數體,即console.log(‘123’);
函數調用
print();
使用上面的代碼可以調用函數,函數的調用方法為funcName([arg1,arg2...,argN])
傳參
首先定義一個帶有參數的函數
function print(str){ console.log(str);}
在這個函數中str為參數,調用方式為print('123')。這時候將'123'傳入了str,在函數中就可以使用str了。
Note
- 以上面的函數為例,在調用的時候可以不傳入參數,文法上是不會有錯的。這時str的值為undefined
- 也可以傳入多個參數,如print('123','456')。因函數定義的時候只定義了一個參數,所以這裡只接收第一個參數。
Javascript函數內建的arguments數組
每個函數內部都有一個內建的arguments數組,它能返回函數接收的所有參數,不管函數有沒有定義參數。
function print(){ console.log(arguments);}//-------------> print('123','456')> ["123", "456"]
這時arguments數組中有兩個元素,分別是'123','456'。
函數的傳回值
function add(num1,num2){ return num1 + num2;}> var result = add(1,2)> console.log(result );> 3
利用arguments改造函數
function add(){ var sum = 0; for(var i=0;i
函數經過改造後我們可以傳任意多的參數,但是參數類型必須是number類型,如果是其他類型最終的結果只能是NaN。
> var result = add(1,2,4,5)> console.log(result );> 12
變數的範圍
首先以JS檔案內部的變數說起。
在js所有{}之外定義的變數都為全域變數。如下
//This is a javascript filevar std = {};
全域變數在任何地方都可以使用,但是在任何一個地方對全域變數的更改都會反應到其他引用變數的地方。
var std = {};std = 0;console.log(std);//這裡我們定義了一個名為std的全域變數,然後為其賦值為0。然後使用console.log列印std這時std的值已經變為了0,而不是{}
函數的參數名對於函數本身來說也是一個變數,這個變數可以在函數體內的任何地方使用,但僅在函數體中有效。
function print(str){ console.log(str);}//str僅在函數體中有效,在函數體外是無法使用str變數的
在{}中定義的變數僅在{}中有效
if(x > 2){ var t = true; console.log(t);}console.log(t);>true>Uncaught ReferenceError: t is not defined
匿名函數和回呼函數
指沒有函數名的函數。
function(a){ print(a);}
匿名函數的應用情境
1. 作為一個變數的值
var print = function(str){ console.log(str);}print('123')> 123
作為函數的參數傳入
function process(data,callback){ if(data.success){ callback(data.msg); }}var myData = { success: true, msg: 'hello'}process(myData,function(msg){ console.log(msg);});
在這裡
function(msg){ console.log(msg);}
就是一個匿名函數,同時也是一個回呼函數。回呼函數指將函數作為變數傳入另一個函數,供其使用。
回呼函數不一定是匿名函數,如下可以對上面的代碼做下改造。
function print(str){ console.log(str);}proccess(myData,print);
自調函數
指函數在定義後可以自行調用。
(function(){ print('123');})()>123
自調函數的傳參
(function(msg){ print(msg);})('123456')
內嵌函數
值在函數中定義函數。內嵌函數的範圍為函數體
遞迴調用
函數在函數體中調用其自身,通常用於遍曆樹狀節點。