funObj closure

2017-06-07  本文已影响0人  Mr丨qing

6.7 函数对象及闭包学习

 * 24.函数对象
 * 25.匿名函数
 * 26.闭包
函数对象

创建函数对象:3种:

  1. 声明方式创建:
    只有以声明方式创建的函数才能被hoist(声明提前)
    function 函数名(参数列表){函数体;return 返回值};
  2. 函数直接量:
    var 函数名=function (参数列表){函数体;return 返回值};
  3. 实例化对象: 参数名和函数体都是字符串
    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种:

  1. 匿名函数自调: 定义后立刻调用
    何时使用:只要一个函数只执行一次时
    如何使用:
    (function([参数列表]){
    函数体;
    return 返回值
    }([参数值列表]));
  2. 回调:将函数作为对象传递给其他函数,由其它函数调用
//自调
(function(){
    console.log("111");
})();

//回调
var arr = [1,9,3,7];
arr.sort(function(a,b){
    return a-b;
});
console.log(arr);
闭包

判断闭包:3特点:

  1. 内外层函数嵌套

  2. 内层函数必须使用了外层函数的局部变量

  3. 外层函数将内层函数返回到外部,可在外部调用

    判断闭包结果:2句话:

  4. 外层函数调用了几次,就有几个受保护的局部变量副本

  5. 同一次外层函数调用返回的内部函数对象,操作同一个变量

    闭包: 实现可重用的局部变量,且保护其不受污染的机制

function f1(){
    var i = 1;
    function  f2(){
        i++;
        console.log(i);
    }
    return f2;
}
var rs = f1();
rs();//局部变量,重用
rs();
rs();
上一篇 下一篇

猜你喜欢

热点阅读