函数表达式


1,函数声明function functionName(arg0,agr1,arg2){} 在firefox,safari,chrome中通过name属性返回函数名
2,函数声明提升,可以把函数声明放在调用它的语句后面
3,函数表达式:var functionName = function(arg0,arg1,arg2){};不被提升,必须放在调用它的语句前面
一,递归
1,argument.callee是一个指向正在执行的函数的指针,在函数名改变的情况下,使用argument.calleee代替函数名实现函数的递归调用
二,闭包

  function f1(){
    var n = 10000;
    function f2(){
      访问到n可以操作n;
    }
    return f2;
  }

1,闭包与变量

  function f1(){
    var n = 10000;
    function f2(){
      访问到n可以操作n;
    }
    return f2;
  }

2,关于this对象
全局环境中,this等于window,当函数被作为方法是用时,this指向这个对象

  var name = "the window";
  var object = {
    name:"my Object",
    getNameFunc:function(){
      return function(){
        return this.name;
      };
    }
  };
  alert(object.getNameFunc()()); 返回the window

将外部函数的this对象保存在闭包能够访问到的变量里
  var name = "the window";

  var object = {
    name:"my Object",
    getNameFunc:function(){
      var that = this;
      return function(){
        return that.name;
      }
    };
  };
  alert(object.getNameFunc()()); 返回my object

  使用argument有同样的问题,所以要想访问作用域中的argument对象,必须将该对象的引用保存在另个闭包能够访问到的变量中
3,内存泄露
闭包会引用包含函数的整个活动对象,最好在外部函数中定义闭包能直接访问的变量,闭包结束后释放变量,减少引用数
函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止
三,模仿块级作用域
1,for循环语句中定义的变量,可以在for循环外部访问到
2,js不会响应是否多次声明了同一个变量,忽略后面的声明但是不会忽略后续中的初始化
3,用作块级作用域的(私有作用域)的匿名函数的语法:(function(){//这里是块级作用域})();
4,函数声明后面不能加(),函数表达式后面可以加();
5,匿名函数中定义的任何变量在结束后都会消失
6,()();可以减少闭包占用的内存问题,只要函数执行完毕,就立即销毁其作用域链了
四,私有变量
有权访问私有变量和私有函数的共有方法称为特权方法

  function(){
    //私有变量和私有函数
    var privateFunction = 10;
    function privateFunction(){
      return false;
    }
    //特权方法
    this.publicMethod = function(){
      privateVariable++;
      return privateFunction();    
    }
  }

1,静态私有变量

  (function(){
    //私有变量和私有函数
    var privateVariable = 10;
    function PrivateFunction(){return false;}
    //构造函数(使用函数表达式方式实现)
    MyObject = function(){};
    //共有特权方法,在构造函数原型上实现
    MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();};
  })();

2,模块模式
  1)创建单例对象,以对象字面量的方式来创建

  (function(){
    //私有变量和私有函数
    var privateVariable = 10;
    function PrivateFunction(){return false;}
    //构造函数(使用函数表达式方式实现)
    MyObject = function(){};
    //共有特权方法,在构造函数原型上实现
    MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();};
  })();

  2)模块模式为单例添加私有变量和特权方法使其得到增强

    var singleton = function(){
      //私有变量和私有函数
      var privateVariable = 10;
      function privateFunction(){return false;}
      //特权共有方法
      return{
        publicProperty:true,
        publicMethod:function(){
          privateVariable ++;
          return privateFunction();
        }
      };
    }();

3,增强的模块模式
  指定单例必须是某种类型的实例时

  var singleton = function(){
    //私有函数和私有变量
    var privateVariable = 10;
    function privateFunction(){return false;}
    //创建特定类型的对象实例
    var object = new CustomType();
    //添加特权共有属性和方法
    object.publicProperty = true;
    object.publicMethod = function(privateVariable ++;return privateFunction();){};
    //返回这个对象
    return object;
  }();
原文地址:https://www.cnblogs.com/b0xiaoli/p/3622614.html