回调函数模式:

  • 基本例子:
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. 转>>在同一个sql语句中如何写不同条件的count数量

    今天在做Portal中的Dashboard展现的时候,需要对多个统计字段做展现,根据我现在的掌握水平,我只能在sql调用构建器中实现一种sql语 句返回的resultSet做展现.没有办法,只能从数据 ...

  2. 使用Fabric进行crash收集统计

    主要是帮助自己记一下地址. 1 申请Crashlytics服务:http://try.crashlytics.com 2 下载Fabric客户端,帮助集成Crashlytics到自己的项目中:http ...

  3. 在Linux用户空间做内核空间做的事情

    导读 我相信,Linux 最好也是最坏的事情,就是内核空间(kernel space)和用户空间(user space)之间的巨大差别.如果没有这个区别,Linux 可能也不会成为世界上影响力最大的操 ...

  4. 关于Unity3D中Resources动态加载NGUI图片的方法

    在NGUI中有些图片我需要动态进行变更或者加载,怎么办? 首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~ NGUI加载图片的方法 ...

  5. Capistrano SSH::AuthenticationFailed, not prompting for password

    文章是从我的个人博客上粘贴过来的, 大家也可以访问 www.iwangzheng.com 在本地执行cap deploy部署的时候会报错: connection failed for: 11.11.1 ...

  6. ORACLE10G工作原理

    数据库查询语句内部执行过程 Select * from   xxx 步骤 分析阶段(parse) 1.         共享池库高速缓存有没有该语句.如果有直接返回结果. 2.         语法分 ...

  7. Java报错原因汇总

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序 遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的 ...

  8. recv和send函数

    转自  http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html 1. send解析 sockfd:指定发送端套接字描述符. bu ...

  9. HTML表单元素Emil和密码

    <form action="" method="post" name="myform"><p>E-mail:< ...

  10. linux ldconfig

    http://blog.csdn.net/dante_k7/article/details/7211868 ldconfig的主要用途: 默认搜寻/lilb和/usr/lib,以及配置文件/etc/l ...