首页 > 其他 > 详细

函数表达式

时间:2014-03-26 09:40:16      阅读:288      评论:0      收藏:0      [点我收藏+]


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 createFunctions(){
    var result = new Array();
    for(var i=0;i<10;i++){
      result[i] = function(num){
        return function(){
          return num;
        }
      }(i);
    }
    return result;
  }
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)创建单例对象,以对象字面量的方式来创建
    var singleton = {
      name:value,
      method:function(){}
    };
  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;
  }();

函数表达式,布布扣,bubuko.com

函数表达式

原文:http://www.cnblogs.com/b0xiaoli/p/3622614.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!