例子:输入动物名字返回动物叫声

版本1.0

function scream(animal) {
        var animal = animal || '';
        switch (animal){
         case '':
          return '输入一个动物名字,如:猫,狗,鸟,猪'
                break;
          case '猫':
            return  '喵~喵~';
            break;
          case '狗':
            return  '旺旺!';
            break;
          case '鸟':
            return  '吱吱吱';
            break;
          case '猪':
            return  '噜噜噜';
            break;
          default:
           return '这种动物的叫声还没有'
           break;
        }
      }

版本2.0//键值对,天然适合 对象形式

function scream(animal) {
        var animal = animal || '';
        var screamAni = {
          '猫':'喵~喵~',
          '狗':'旺旺',
          '鸟':'吱吱吱',
          '猪':'噜噜噜'
        }
        if(animal === ''){
          return '请输入动物名,比如:猫,狗,鸟,猪'
        }
        if(typeof(screamAni[animal]) !== undefined){
          return screamAni[animal];
        }
        return '还没有这种动物的叫声'
      }
这你就很搞笑了,本来以为不支持中文,
起码chorom似乎支持中文变量.

版本3.0//

      function scream(animal) {
        var animal = animal || '';
        var screamAni = {
          '猫':'喵~喵~',
          '狗':'旺旺',
          '鸟':'吱吱吱',
          '猪':'噜噜噜'
        }
        if(animal === ''){
          return '请输入动物名,比如:猫,狗,鸟,猪'
        }
        if(!screamAni[animal]){
          screamAni[animal] = window.prompt('还没有这种动物的叫声,请输入该动物的叫声');
          return arguments.callee(animal);
        }else{
          console.log(screamAni[animal]);
          return screamAni[animal];
          
        }
      }

我本来想功能:如果没有就补充进来,果然上面的代码是行不通的.
原因在于,执行函数时,变量重新声明,
要么让screamAni变成全局变量,要么通过闭包使其变成私有变量,

版本3.1

      var scream = (function () {
        var screamAni = {
          '猫':'喵~喵~',
          '狗':'旺旺',
          '鸟':'吱吱吱',
          '猪':'噜噜噜'
        }
        return function (animal) {
          var animal = animal || '';
          if(animal === ''){
            return '请输入动物名,比如:猫,狗,鸟,猪'
          }
          if(!screamAni[animal]){
            screamAni[animal] = window.prompt('还没有这种动物的叫声,请输入该动物的叫声');
            return arguments.callee(animal);
          }else{
            console.log(screamAni[animal]);
            return screamAni[animal];
          }
        }
      })();

版本4.0//也是闭包,但我最近刚接触,有点突破脑洞
//是从一种叫惰性函数的地方来的.

var scream = function (animal) {
        var screamAni = {
          '猫':'喵~喵~',
          '狗':'旺旺',
          '鸟':'吱吱吱',
          '猪':'噜噜噜'
        }
        scream = function (animal) {//这里绝对不能 写成 var scream = function (animal){
          var animal = animal || '';
          if(animal === ''){
            return '请输入动物名,比如:猫,狗,鸟,猪'
          }
          if(!screamAni[animal]){
            screamAni[animal] = window.prompt('还没有这种动物的叫声,请输入该动物的叫声');
            return arguments.callee(animal);
          }else{
            console.log(screamAni[animal]);
            return screamAni[animal];
          
          }
        }
        return scream(animal);
      };

为什么说这个函数破脑洞呢? 
因为他在函数执行的过程当中,
改变了函数体本身.
惰性函数的应用可以减少性能消耗.
具体可以百度.

但我第一次接触这种函数体内根据情况,改写自身函数的形式,
还是感觉挺突破脑洞的.
虽然我还无法知道这个有什么用,
但下意识觉得,这让函数变得更加灵活,更有生命力?

======================================
过了三四周回头看,
上面说的都是一个思路,都一样..
这几天学设计模式
根据面向对象的设计模式的原则,
上面的函数,违反了开闭原则

可以这样?

            function Animal () {
                
            this.obj = {
                  '狗' : "旺旺",
                  "猫" : "喵喵",
                  "猪" : "露露"
                }
            
            this.scream = function (animal) {
              console.log(this.obj[animal]);
                return this.obj[animal];
            }
            this.extend = function (opt) {
                for(var key in opt) {
                  this.obj[key] = opt[key];
                }
            }
            }
            var animal = new Animal();
            
            animal.scream("狗")// "旺旺"
            
            animal.extend({"鸟":"吱吱"});// 可扩展.
            
            animal.scream("鸟")// "吱吱"

似乎,惯例是把方法,存在原型上

            function Animal () {
                
            this.obj = {
                  '狗' : "旺旺",
                  "猫" : "喵喵",
                  "猪" : "露露"
                }
            }
            
            Animal.prototype.scream = function (animal) {
              console.log(this.obj[animal]);
              return this.obj[animal];              
            }
            Animal.prototype.extend = function (opt) {
              for(var key in opt) {
                this.obj[key] = opt[key];
              }
            }
            var animal = new Animal();
            animal.scream("狗")// "旺旺"
            animal.extend({"鸟":"吱吱"});
            animal.scream("鸟")// "吱吱"

联想策略模式的话,
可以这样

            function Animal () {
                
            this.obj = {
                  '狗' : function (cb) {
                    cb("旺旺");
                  },
                  "猫" : function (cb) {
                    cb("旺旺");
                  },
                  "猪" : function (cb) {
                    cb("露露");
                  }
                }
            }
            
            function handle (value) {
                console.log(value);
            }
            
            Animal.prototype.scream = function (animal,handle) {
               this.obj[animal](handle);    
            }
            Animal.prototype.extend = function (opt) {
              for(var key in opt) {
                this.obj[key] = opt[key];
              }
            }
            var animal = new Animal();
            
            animal.scream("狗",handle);
            
            animal.extend({
              "鸟" : function (cb) {
                cb("吱吱")
              }
            })
            
            animal.scream("鸟",handle);
            function Animal () {
                
            this.obj = {
                  '狗' : "旺旺",
                  "猫" : "喵喵",
                  "猪" : "露露"
                }
            
            }
            
            function handle (value) {
                console.log(value);
            }
            
            Animal.prototype.scream = function (animal,handle) {
              handle(this.obj[animal])
            }
            Animal.prototype.extend = function (opt) {
              for(var key in opt) {
                this.obj[key] = opt[key];
              }
            }
            var animal = new Animal();
            
            animal.scream("狗",handle);
            
            animal.extend({
              "鸟" : "吱吱"
            })
            
            animal.scream("鸟",handle);
            function Animal () {
                
            this.obj = {
                  '狗' : "旺旺",
                  "猫" : "喵喵",
                  "猪" : "露露"
                }
            this.cache = [];
            }
            
            function handle (value) {
                console.log(value);
            }
            
            Animal.prototype.add = function (animal,handle) {
              var self = this;
              this.cache.push(function () {
                handle(self.obj[animal])
              })
            }
            Animal.prototype.extend = function (opt) {
              for(var key in opt) {
                this.obj[key] = opt[key];
              }
            }
            
            Animal.prototype.scream = function () {
                for(var i = 0; i < this.cache.length ; i++) {
                  this.cache[i]()
                }
            }
            
            
            var animal = new Animal();
            
            animal.add("狗",handle);
            animal.scream();
            animal.extend({
              "鸟" : "吱吱"
            })
            animal.add("鸟",handle);
            animal.scream();

// 但是不好从 cache 那里 删除相应的函数, 我们可以考虑 让cache = {}
            function Animal () {
                
            this.obj = {
                  '狗' : "旺旺",
                  "猫" : "喵喵",
                  "猪" : "露露"
                }
            this.cache = {};
            }
            
            function handle (value) {
                console.log(value);
            }
            
            Animal.prototype.add = function (animal,handle) {
              var self = this;
              this.cache[animal]= function () {
                handle(self.obj[animal])
              }
            }
            Animal.prototype.extend = function (opt) {
              for(var key in opt) {
                this.obj[key] = opt[key];
              }
            }
            
            Animal.prototype.scream = function () {
                for(var key in this.cache) {
                  this.cache[key] && this.cache[key]();
                }
            }
            Animal.prototype.remove = function (animal) {
                this.cache[animal] = null;
            }
            
            
            var animal = new Animal();
            
            animal.add("狗",handle);
            animal.scream();
            animal.extend({
              "鸟" : "吱吱"
            })
            animal.add("鸟",handle);
            animal.scream();
            animal.remove("狗");
            animal.scream();

但有时,我们希望一次触发多个.
            function Animal () {
                
            this.obj = {
                  '狗' : "旺旺",
                  "猫" : "喵喵",
                  "猪" : "露露"
                }
            this.cache = {};
            }
            
            function handle (value) {
                console.log(value);
            }
            
            Animal.prototype.add = function (animal,handle) {
              var self = this;
              if (Array.isArray(this.cache[animal])) {
                this.cache[animal].push(function () {
                    handle(self.obj[animal]);
                })
              }else{
                this.cache[animal] = [function () {
                  handle(self.obj[animal]);
                }];
              }
            }
            Animal.prototype.extend = function (opt) {
              for(var key in opt) {
                this.obj[key] = opt[key];
              }
            }
            
            Animal.prototype.scream = function (animal) {
                var len = this.cache[animal].length;
                for(var i = 0; i < len ; i++) {
                  this.cache[animal][i]();
                }
            }
            Animal.prototype.remove = function (animal) {
                this.cache[animal] = [];
            }
            
            
            var animal = new Animal();
            
            animal.add("狗",handle);
            animal.scream("狗");
            animal.extend({
              "鸟" : "吱吱"
            })
            animal.add("鸟",handle);
            animal.scream("鸟");
            animal.remove("狗");
            animal.scream("狗");

以上只是回顾一下,设计模式里的一些内容.
感觉整体结构不是很清晰.
凑合看吧.

不过这里能看出一些东西.
设计模式那里有讲过,
使用设计模式的一些结构,
是会增加复杂度和耦合度的.
但好处是, 可扩展性高, 维护性高.
而且越是扩展时,就越是会有积极作用.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,138评论 0 13
  • 人生若不感冒 何需一把鼻涕一把泪
    三更语阅读 199评论 0 0
  • 由于安卓系统显示的emoji表情不那么好看,所以在项目的聊天里面使用了自己的图片代替了系统的emoji显示,但是问...
    晓晓罗阅读 15,180评论 0 1
  • 为了完成作业,特意去百度搜索“故事思维”。映入眼帘的是一本书名,《故事思维》,世界级故事大师安妮特·西蒙斯...
    极简主义生活方式奉行者阅读 151评论 0 0