一、函數本質
- 函數本質上就是對象,函數名指向函數對象。
function f(){
return 123;
}
var num = f();
var x = f;
console.log(typeof f); //function
二、創建函數(共3種方法)
- 直接使用function關鍵字聲明新的函數
function f1(){}
- 使用Function對象創建
var f2 = new 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(10)); //NaN
console.log(add(10,20)); //NaN
console.log(add(10,20,30)); //60
由上面例子可以看出,JavaScript中不支持多態,下面用arguments來解決這個問題
function add(){
var sum = 0;
for(var i = 0 ;i<arguments.length;i++){
sum += arguments[i];
}
return sum;
}
console.log(add(10)); //10
console.log(add(10,20)); //30
console.log(add(10,20,30)); //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 = 1 ;
function a(){
console.log(i++);
if(i < 10){
a();
}
}
a();
7、 系統函數
- setInterval()
- setTimeOut()
8、 懶函數
- 只做一次就變化的函數
- 用途:優化JS性能、創建對象、處理兼容性……
function a(){
console.log("hello")
a = 5;
}
a(); //hello
a(); //會報錯