6.7 函數(shù)對象及閉包學(xué)習(xí)
* 24.函數(shù)對象
* 25.匿名函數(shù)
* 26.閉包
函數(shù)對象
創(chuàng)建函數(shù)對象:3種:
- 聲明方式創(chuàng)建:
只有以聲明方式創(chuàng)建的函數(shù)才能被hoist(聲明提前)
function 函數(shù)名(參數(shù)列表){函數(shù)體;return 返回值}; - 函數(shù)直接量:
var 函數(shù)名=function (參數(shù)列表){函數(shù)體;return 返回值}; - 實(shí)例化對象: 參數(shù)名和函數(shù)體都是字符串
var 函數(shù)名=new Function(
"參數(shù)名1","參數(shù)名2",...,"函數(shù)體; return 返回值");
function one (a,b){
return a+b;
}
var two = function (a,b) {
return a+b;
}
var three = new Function(
'a','b','return a+b;'
);
arguments對象:接收所有傳入函數(shù)的參數(shù)值的類數(shù)組對象
默認(rèn)所有函數(shù)都會自動創(chuàng)建,直接可用。
類數(shù)組對象:長得像數(shù)組的對象,不是數(shù)組類型的實(shí)例(對象)
arguments instanceof Array -->false
function ar() {
if (arguments.length==1){
console.log('length=1');
}else if(arguments.length==2){
console.log('length=2');
}
console.log(arguments instanceof Array); //false
}
ar(1);
ar(1,2);
匿名函數(shù)
沒有函數(shù)名的函數(shù)定義
沒有任何變量引用
何時:只要一個函數(shù)只執(zhí)行一次時,就用匿名函數(shù)。
執(zhí)行完,立刻釋放!
為什么使用:匿名函數(shù)沒有變量引用,調(diào)用完自動釋放!
缺點(diǎn):不可重用!
如何使用:2種:
- 匿名函數(shù)自調(diào): 定義后立刻調(diào)用
何時使用:只要一個函數(shù)只執(zhí)行一次時
如何使用:
(function([參數(shù)列表]){
函數(shù)體;
return 返回值
}([參數(shù)值列表])); - 回調(diào):將函數(shù)作為對象傳遞給其他函數(shù),由其它函數(shù)調(diào)用
//自調(diào)
(function(){
console.log("111");
})();
//回調(diào)
var arr = [1,9,3,7];
arr.sort(function(a,b){
return a-b;
});
console.log(arr);
閉包
判斷閉包:3特點(diǎn):
內(nèi)外層函數(shù)嵌套
內(nèi)層函數(shù)必須使用了外層函數(shù)的局部變量
-
外層函數(shù)將內(nèi)層函數(shù)返回到外部,可在外部調(diào)用
判斷閉包結(jié)果:2句話:
外層函數(shù)調(diào)用了幾次,就有幾個受保護(hù)的局部變量副本
-
同一次外層函數(shù)調(diào)用返回的內(nèi)部函數(shù)對象,操作同一個變量
閉包: 實(shí)現(xiàn)可重用的局部變量,且保護(hù)其不受污染的機(jī)制
function f1(){
var i = 1;
function f2(){
i++;
console.log(i);
}
return f2;
}
var rs = f1();
rs();//局部變量,重用
rs();
rs();