回调函数模式:

  • 基本例子:
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. [整理]Code::Blocks使用遇到的问题

    在使用其编写C小程序的过程总会遇到些问题,特整理如下: 1.无法调试 注意的是项目所在的文件路径不能包含中文. 2.头文件接口函数申明引用无效 查看头文件是否处于可编译状态,左侧项目文件列表里是文件名 ...

  2. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  3. getVisibleSize 和 getContentSize 和 getWinSize

    getVisibleSize:获得视口(可视区域)的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize.getVisibleOr ...

  4. java笔记--查看和修改线程的优先级

    查看和修改线程的优先级 java中每一个线程都有优先级属性,在默认情况下,新建的线程的优先级与创建该线程的线程优先级相同.每当线程调度器选择要运行的线程时,通常选择优先级较高的线程. 注:线程的优先级 ...

  5. linux shell 流程控制

    导读 和Java.PHP等语言不一样,linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使 ...

  6. git寻根——^和~的区别

    一. 引子 在git操作中,我们可以使用checkout命令检出某个状态下文件,也可以使用reset命令重置到某个状态,这里所说的“某个状态”其实对应的就是一个提交(commit). 我们可以把一个g ...

  7. 最长回文子串O(n)算法

    原文链接:英文版链接 首先,我们将字符串S中插入符号“#”转化成另一个字符串T. 比如:S = "abaaba",T = “#a#b#a#a#b#a#”. 为了找到最长回文字串,我 ...

  8. 【Linux】/dev/null 2>&1 详解

     今天一个朋友突然在自己的维护的Linux中, /var/spool/cron/root 中看到了以下的内容: 30 19 * * * /usr/bin/**dcon.sh > /dev/nul ...

  9. C++基础知识面试精选100题系列(1-10题)[C++ basics]

    [原文链接] http://www.cnblogs.com/hellogiser/p/100-interview-questions-of-cplusplus-basics-1-10.html [题目 ...

  10. Java for LeetCode 044 Wildcard Matching

    Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...