回调函数模式:

  • 基本例子:
var findNodes = function (callback) {
......................
if (typeof callback !== 'function') {
callback = false;
}
................
while(i) {
i --;
............
if(callback) {
callback(found)
}
............
}
}
  • 回调方法是对象方法的时候:

    var findNodes = function (callback, callback_obj) {
    .........
    if(typeof callback === 'string') {
    callback = callback_obj[callback];
    }
    ...........
    if(typeof callback === 'function') {
    callback.call(callnack_obj, found);
    }
    ...........
    }
    //findNodes('paint', myapp);
  • 常使用情况:
    • 异步事件监听器
    • 超时

返回函数模式:根据输入,函数可以返回另一个更专门的函数,也可以按需创建另一个函数;

结合闭包创建的计数器的例子:

var setup = function() {
var count = 0;
return function () {
return count++;
}
}

惰性函数模式:函数直到第一次使用 时才被正确地定义,并且具有向后惰性,执行了更少的工作;

var scareMe = function() {
alert('Boo!');
scareMe = function() {
alert('Double boo!');
}
}

适用:具有仅需执行一次的初始化设定;

缺点:

  • 重定义自身时,原本加上去的属性会消失或需要再次定义;
  • 若赋值给其它方法,将不再具有这个功能;

即时函数模式:在函数定义之后立即执行

  • 参数:一般通过括号传入

    (function (a, b) {})(a, b);
  • 返回值:分配给变量;
    • 可以使用即时函数的作用域存储一些私有数据:

      var getResult = (function () {
      var res = 2 + 2;
      return function () {
      return res;
      }
      })();
      //可以和返回函数模式比较一下;
    • 定义对象属性时也可以用即时函数:
      var o = {
      message : (function () {
      .......
      }()),
      getMsg: function() {
      return this.message;
      }
      }  

 即时对象初始化模式:

  • 概念:

    • 保护全局作用域不受污染的另一个方法,类似于即时函数模式;
    • 这种模式使用带有init()方法的对象,该方法在创建对象后会立即执行;
    • init()函数负责所有初始化任务
({
//配置常数
maxWidth : 600,
maxHeigth: 400,
...........
//设置一些其他方法
gimmeMax: fnction () {
return this.maxWidth + 'x' + this.maxHeight;
}
..............
init: function () {
console.log(this.getmeMax());
............
}
}).init();
  • 这种模式适用于一次性任务,如果在init()完毕之后保存该对象的引用,可以在init函数尾部添加 return this;

初始化时分支模式(优化模式): 如果知道某个条件在整个生命周期内不会发生改变,可以仅对该条件测试一次;

  • XMLHttpRequest的例子:

    • 在每次都测试的情况下:

      var utils = {
      addListener : function (el , type, fn) {
      if (typeof window.addEventListener === 'function') {
      el.addEventListener(type, fn, false);
      } else if (typeof document.attachEvent === 'function') {
      el.attachEvent('on' + type, fn);
      } else {
      el['on' + type] = fn;
      }
      },
      removeListener: function (el, type, fn) {
      ........
      }
      }
    • 仅在第一次测试的情况下:
      var utils = {
      addListener : function (el , type, fn) { },
      removeListener: function (el, type, fn) {
      ........
      }
      } var utils = {
      addListener: null,
      removeListener: nul
      }
      if (typeof window.addEventListener === 'function') {
      utils.addListener = function (el, type, fn) {
      el.addEventListener(type, fn, false);
      }
      utils.removeListener = function (el, type, fn) {
      el.removeListener (type, fn, false);
      }
      } else if (typeof document.attachEvent === 'function') {
      utils.addListener = function (el, type, fn) {
      el.attachEvenr('on' + type, fn);
      }
      utils.removeListener = function (el, type, fn) {
      el.detachEvenr('on' + type, fn);
      }
      } else {
      utils.addListener = function (el, type, fn) {
      el['on' + type] = fn;
      }
      utils.removeListener = function (el, type, fn) {
      el['on' + type] = null;
      }
      }

备忘模式:在适当的时候自定义属性到函数中;

var myFunc = function () {
var cachekey = JSON.stringify(Array.prototype.slice.call(arguments)),
result;
if(!myFunc.cache[cachekey]) {
result = {};
.............
myFunc.cache[cachekey] = result;
}
return myFunc.cache[cachekey];
}
myFunc.cache = {};

配置对象模式:考虑到随着项目变化而需求变化而提供更简介的API的方法;

var conf = {
username: "batman",
first: "Bruce",
last: 'Wayne'
}
addPerson(conf)

特别适用于有许多可选特征属性的情况,如创建DOM时;

Curry模式:使函数理解并处理部分应用的过程称为Curry过程;

  • curry化函数:

    function curry(fn) {
    var slice = Array.prototype.slice;
    stored_args = slice.call(arguments, 1);
    return function () {
    var new_args = slice.call(arguments),
    args = stored_args.concat(new_args);
    return fn.apply(null, args);
    }
    }
    //
    function add(a, b) {
    return a + b;
    }
    curry(add, 6)(7);
  • 使用bind
    function add (a, b ,c) {
    return a + b + c;
    } add.bind(null,0,1)(2 /*c*/);

      

 

 

 

javascript优化--05模式(函数)的更多相关文章

  1. javascript优化--13模式1(DOM和浏览器模式)

    注意分离: 通过将CSS关闭来测试页面是否仍然可用,内容是否依然可读: 将JavaScript关闭来测试页面仍然可以执行正常功能:所有连接是否正常工作:所有的表单是否可以正常工作: 不使用内联处理器( ...

  2. javascript优化--08模式(代码复用)01

    优先使用对象组合,而不是类继承: 类式继承:通过构造函数Child()来获取来自于另一个构造函数Parent()的属性: 默认模式:子类的原型指向父类的一个实例 function inherit(C, ...

  3. javascript优化--06模式(对象)01

    命名空间: 优点:可以解决命名混乱和第三方冲突: 缺点:长嵌套导致更长的查询时间:更多的字符: 通用命名空间函数: var MYAPP = MYAPP || {}; MYAPP.namespace = ...

  4. javascript优化--07模式(对象)02

    沙箱模式: 解决空间命名模式的几个缺点: 命名空间模式中无法同时使用一个应用程序或库的两个版本运行在同一个页面中,因为两者需要相同的全局符号: 以点分割,需要输入更长的字符,解析时间也更长: 全局构造 ...

  5. javascript优化--11模式(设计模式)02

    策略模式 在选择最佳策略以处理特定任务(上下文)的时候仍然保持相同的接口: //表单验证的例子 var data = { firs_name: "Super", last_name ...

  6. javascript优化--14模式2(DOM和浏览器模式)

    远程脚本 XMLHttpRequest JSONP 和XHR不同,它不受同域的限制: JSONP请求的可以是任意的文档: 请求的URL通常格式为http://example.js?calback=Ca ...

  7. javascript优化--10模式(设计模式)01

    单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...

  8. javascript优化--09模式(代码复用)02

    原型继承 ://现代无类继承模式 基本代码: var parent = { name : "Papa" } var child = object(parent); function ...

  9. javascript笔记05:函数表达式和函数语句的区别

    1.首先是函数语句: myfunc(); function myfunc() { //执行一些语句 } 当函数语句被定义的时候,在一个脚本代码被优先考虑,因此,无论该函数是定义之前或者定义之后都可以被 ...

随机推荐

  1. C#常用函数→ASP.NET篇

    C#常用函数→ASP.NET篇 转载地址→http://www.cnblogs.com/superfang/archive/2008/07/02/1233706.html 以前我都是"原文地 ...

  2. [Effective JavaScript 笔记]第44条:使用null原型以防止原型污染

    第43条中讲到的就算是用了Object的直接实例,也无法完全避免,Object.prototype对象修改,造成的原型污染.防止原型污染最简单的方式之一就是不使用原型.在ES5之前,并没有标准的方式创 ...

  3. 一次手工注入waf [转载]

    转载自sss安全论坛 目标站点:http://www.xxx.cn:88注入点:http://www.xxx.cn:88/new/details1.asp?n_id=49909对其进行检测:http: ...

  4. iPhone取消软件更新上边的1

    去除设置的更新+1小红点提示主要分为越狱和非越狱设备两种方法. 越狱状态下方法: 首先将你的设备进行越狱: 越狱后安装ifile(这个自行搜索安装): 用ifile打开/System/Library/ ...

  5. maven项目,导入的jar包,没有包含在pom文件中,install失败

    [INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[ ...

  6. Json简介与转换数据例子

    Json是什么,Json就是javascript对象或者数组格式的字符串,Http协议不能传递JavaScript对象,所以要转换为字符串进行传输.AJAX传递复杂数据如果自己进行格式定义的话会经历组 ...

  7. Android实现电子邮箱客户端

    本文主要讲述了安卓平台上利用QQ邮箱SMTP协议,POP3协议发送与接收消息的实现 发送邮件核心代码 import java.security.Security; import java.util.D ...

  8. 关于struts 2中的日期问题

    struts 2中引入了大量的jquery的内容 其中日期问题总结一下: 步骤: 1.当然不用说,先建一个web项目 2.导入struts2所需要的jar包,以及此插件的包(当然你也可以用:strut ...

  9. Linux下的ip命令,除了ifconfig还有很多

    linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...

  10. C#学习笔记-----基于AppDomain的"插件式"开发

    很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...