一、函數本質
- 函數本質上就是對象,函數名指向函數對象。
function f(){
return ;
}
var num = f();
var x = f;
-
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(); //會報錯