6.7 函数对象及闭包学习
* 24.函数对象
* 25.匿名函数
* 26.闭包
函数对象
创建函数对象:3种:
- 声明方式创建:
只有以声明方式创建的函数才能被hoist(声明提前)
function 函数名(参数列表){函数体;return 返回值}; - 函数直接量:
var 函数名=function (参数列表){函数体;return 返回值}; - 实例化对象: 参数名和函数体都是字符串
var 函数名=new Function(
"参数名1","参数名2",...,"函数体; 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对象:接收所有传入函数的参数值的类数组对象
默认所有函数都会自动创建,直接可用。
类数组对象:长得像数组的对象,不是数组类型的实例(对象)
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);
匿名函数
没有函数名的函数定义
没有任何变量引用
何时:只要一个函数只执行一次时,就用匿名函数。
执行完,立刻释放!
为什么使用:匿名函数没有变量引用,调用完自动释放!
缺点:不可重用!
如何使用:2种:
- 匿名函数自调: 定义后立刻调用
何时使用:只要一个函数只执行一次时
如何使用:
(function([参数列表]){
函数体;
return 返回值
}([参数值列表])); - 回调:将函数作为对象传递给其他函数,由其它函数调用
//自调
(function(){
console.log("111");
})();
//回调
var arr = [1,9,3,7];
arr.sort(function(a,b){
return a-b;
});
console.log(arr);
闭包
判断闭包:3特点:
内外层函数嵌套
内层函数必须使用了外层函数的局部变量
-
外层函数将内层函数返回到外部,可在外部调用
判断闭包结果:2句话:
外层函数调用了几次,就有几个受保护的局部变量副本
-
同一次外层函数调用返回的内部函数对象,操作同一个变量
闭包: 实现可重用的局部变量,且保护其不受污染的机制
function f1(){
var i = 1;
function f2(){
i++;
console.log(i);
}
return f2;
}
var rs = f1();
rs();//局部变量,重用
rs();
rs();