funObj|funObj closure

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. 同一次外层函数调用返回的内部函数对象,操作同一个变量
    【funObj|funObj closure】闭包: 实现可重用的局部变量,且保护其不受污染的机制
function f1(){ var i = 1; functionf2(){ i++; console.log(i); } return f2; } var rs = f1(); rs(); //局部变量,重用 rs(); rs();

    推荐阅读