回调函数模式:

  • 基本例子:
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. Don't make me think 摘录与读后感

    别让我思考 ——Krug可用性第一定律 点击多少次都没关系,只要每次点击都是无需思考,明确无误的选择.——Krug可用性第二定律 去掉每个页面上一般的文字, 然后把剩下的文字再去掉一半 ——Krug可 ...

  2. UIView 注意问题

    1. UIView.userInteractionEnabled UIView.userInteractionEnabled默认值是YES http://blog.csdn.net/studyreco ...

  3. ubuntu12 apache2部署多个网站的方法

    由于对apache2的配置不是很精通.吃了不少瘪. 这里总结下,希望对碰到同样问题的人带来帮助: 假设需求是有两个站点,site1和site2.其端口分别为80和8080. 1. 配置监听端口 修改 ...

  4. 38.输出1到最大的N位数[Print 1 to max number of N bits]

    [题目] 输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. [分析] 这是一道很有意思的题目.看起来很简单,其实里面却有不少的玄机. [常规思路 ...

  5. Android PullToRefreshListView上拉刷新和下拉刷新

    PullToRefreshListView实现上拉和下拉刷新有两个步骤: 1.设置刷新方式 pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH) ...

  6. 如何使用box2d做碰撞检测

    cocos2dx3.0+vs2012编译通过. 主要是通过body->SetTransform来设置body的位置和角度,然后自己写个ContactListener来监听碰撞事件 源代码下载 # ...

  7. BestCoder14 1002.Harry And Dig Machine(hdu 5067) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目意思:给出一个 n * m 的方格,每一个小方格(大小为1*1)的值要么为 0 要么为一个正 ...

  8. Android 设置旋转朝向

    在AndroidMenifest.xml中activity标签中,添加一个属性 android:screenOrientation="landscape"

  9. 考前复习(codevs 2837)

    2837 考前复习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description Aiden马上要考试了,可他 ...

  10. icon上添加数字提醒

    使用viewbadger包: package com.jingle.vierbagerstudy; import android.app.Activity; import android.os.Bun ...