SlideShare a Scribd company logo
JS对象及函数式编程乱步
              Alipay WD @晴川 on 2011-07-29




11年7月29日星期五                                 1
⼀一起聊聊熟悉的编程语言和JS框架




11年7月29日星期五                       2
面向对象编程 vs. 面向过程编程




11年7月29日星期五                       3
动态解释型语言 vs. 静态编译型语言




11年7月29日星期五                         4
JS的特点:入门易精通难




11年7月29日星期五              5
JS的特点:入门易精通难
              属于Java的部分

               ⼀一切皆是对象(!特殊值 集合 数组)

               封装与继承(!类)

              属于Script的部分

               独占式执行的脚本语言CSSL 

               与DOM关系密切(!Node.js)


11年7月29日星期五                          6
编码规范和约定

              为什么使用var定义变量

              为什么使用{}代替new Object()

              为什么使用[]代替new Array()

              有哪些OOP原则值得借鉴

              说"eval是恶魔"?



11年7月29日星期五                           7
继续各种求解释
    function average(x,y) {
      return (x+y)/2;
    }
    var z = average(1,3);


    var z = (function(x,y) {
          return (x+y)/2;
        })(1,3);



11年7月29日星期五                    8
继续各种求解释



    eval('(' + json + ')')




11年7月29日星期五                  9
继续各种求解释
    function foo(){
      if(window===parent){
        function bar(){alert(1);}
      }
      else{
        function bar(){alert(2);}
      }
      bar();
    }
    foo();



11年7月29日星期五                         10
继续各种求解释


    for ( var i = 0; i < its.length; i++ ) {
      //(function(){
        its[i].onclick = function(){alert(i);}
      //})();
    }




11年7月29日星期五                                      11
"函数是⼀一等公民"




11年7月29日星期五                12
"函数是⼀一等公民"

              匿名函数与命名函数

              声明与表达式语句

              ”(”和”)”构成⼀一个分组操作符,而分组操作符只
              能包含表达式——匿名函数表达式

              命名函数表达式——产生可靠的栈调用信息的唯
              ⼀一途径
                自执行匿名函数:(function(){})();

11年7月29日星期五                                 13
函数的定义方式
               函数声明:

              function Identifier ( FormalParameterList
              opt ) { FunctionBody }

               函数表达式:

              function Identifier opt
              ( FormalParameterList opt ) { FunctionBody }

               ECMAScript 根据上下文来区分函数声明和函数表达式,
               假设 "function test(){}" 是⼀一个表达式的⼀一部分,
               它就是⼀一个函数表达式,否则它就是⼀一个函数声明。



11年7月29日星期五                                                  14
函数的调用方式
              1)全局函数           1)Global对象

              2)对象方法           2)调用对象

              3)构造函数           3)构造返回对象

              4)apply/call调用   4)调用时传入的第⼀一个
                               参数
              区别在于函数内this指
              针的绑定——




11年7月29日星期五                                   15
"原型链" + "作用域链"




11年7月29日星期五                    16
"原型链" + "作用域链"
              树遍历与链回溯

              原型继承与实例构造

              上下文与作用域

              形参与实参

              全局变量与局部变量

              内部函数与外部函数


11年7月29日星期五                    17
"解析时"与"运行时"




11年7月29日星期五                 18
"解析时"与"运行时"


              活动对象

              函数声明会在任何表达式被解析和求值之前先
              行被解析和求值。




11年7月29日星期五                          19
"超空间"与生存期




11年7月29日星期五               20
"超空间"与生存期



              渲染引擎与脚本引擎




11年7月29日星期五                21
闭包




11年7月29日星期五        22
用累加器做示例

         function a() {
             var i = 0;        内部函数
             function b() {
                               外部函数
                 alert(++i);
             }                 局部变量
             return b;
         }                     内部函数在外部
         var c = a();          函数返回后被执
         c();                  行



11年7月29日星期五                              23
闭包

              是⼀一个表达式(⼀一般是函数),它具有自由变
              量以及绑定这些变量的环境(该环境“封闭
              了”这个表达式)。

              闭包封闭的外部变量就是自由变量,而由于该
              自由变量存在,外部函数即便返回,其占用的
              内存也得不到释放。



11年7月29日星期五                            24
函数式编程




11年7月29日星期五           25
想想那些好用的方法


              .sort()

              .each()

              .map()

              .grep()




11年7月29日星期五               26
λ演算
              (lambda calculus)

              是⼀一套用于研究函数定义、函数应用和递归的
              形式系统。Lambda演算可以被称为最小的通用
              程序设计语言。

              虽然 λ 演算并非设计来于计算机上运行,但可
              视为第⼀一个函数式编程语言。




11年7月29日星期五                             27
函数式编程

              最古老的例子莫过于1958年被创造出来的LISP
              了,通过 LISP,可以用精简的人力,实现通用
              的程序设计。

              较现代的例子包括Scheme、Haskell、Clean、
              Erlang和Miranda等。

              Scheme,是⼀一种多范型的编程语言,它是LISP
              的两种主要的方言之⼀一。


11年7月29日星期五                                   28
柯里化 [CURRYING]


              高阶函数

              函数计算比代码运行重要

              函数计算可做到随时调用




11年7月29日星期五                    29
function add(a, b) {
        if (arguments.length < 1) {
            return add;
        } else if (arguments.length < 2) {
            return function(c) {return a + c;}
        } else {
            return a + b;
        }
    }



11年7月29日星期五                                      30
function curry(func,args,space) {
        var n  = func.length - args.length;
        var sa = Array.prototype.slice.apply(args);
        function accumulator(moreArgs,sa,n) {
            var saPrev = sa.slice(0); // to reset
            var nPrev  = n; // to reset
            for(var i=0;i<moreArgs.length;i++,n--) {
                sa[sa.length] = moreArgs[i];
            }
            if ((n-moreArgs.length)<=0) {
                var res = func.apply(space,sa);
                sa = saPrev;
                n  = nPrev;
                return res;
            } else {
                return function (){
                    return
    accumulator(arguments,sa.slice(0),n);
                }
            }
        }
        return accumulator([],sa,n);
    }
11年7月29日星期五                                            31
function add (a,b,c){
          if (arguments.length <
    this.add.length) {
            return
    curry(this.add,arguments,this);
          }
          return a+b+c;
    }

    alert(add()(1,2,4));        //   7
    alert(add(1)(2)(5));        //   8
    alert(add(1)()(2)()(6));    //   9
    alert(add(1,2,7,8));        //   10

11年7月29日星期五                               32
function container() {
          var secret = 100;
          this.add = function (a,b,c){
              if (arguments.length <
      this.add.length) {
                  return
      curry(this.add,arguments,this);
              }
              return a+b+c + secret;
          }
          this.adjustSecret =  function (n)
      { secret = n; }
          this.giveSecret = function()
      { return secret; }
      }


11年7月29日星期五                                   33
con = new container();
      alert("secret is : "+con.giveSecret());
      // check that value is indeed 100
      curriedthingy = con.add(1,2);          
      // let's create a curried function
      alert(curriedthingy(4));                
      // this alerts 107, as expected.
      con.adjustSecret(1000);                
      // now, in the original con object,
      alert(curriedthingy(4));                
      // and presto, it does. alerts 1007.



11年7月29日星期五                                      34
更多函数式编程示例


              函数式编程语言的"Hello World" 程序是阶乘函
              数。

              http://zh.wikipedia.org/zh-cn/Hello_World




11年7月29日星期五                                               35

More Related Content

PDF
Java script closures
DOC
泛型总结
PPTX
Scala再探
DOC
深入剖析Concurrent hashmap中的同步机制(下)
PDF
所谓闭包
PDF
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
PDF
sorting
PPTX
所谓闭包
Java script closures
泛型总结
Scala再探
深入剖析Concurrent hashmap中的同步机制(下)
所谓闭包
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
sorting
所谓闭包

What's hot (20)

PPTX
Sicmutils 介紹:Scmutils 的 Clojure 版函式庫
PPT
JAVA内存泄漏及诊断
PDF
Java 開發者的函數式程式設計
PDF
Jscex:案例、阻碍、体会、展望
DOC
Java华为面试题
PDF
Jscex:案例、经验、阻碍、展望
PPT
Hi Haskell
PDF
Js is js(程劭非) (1)
PDF
C python 原始碼解析 投影片
DOCX
系統程式 -- 第 12 章 系統軟體實作
PPT
第01章 绪论(java版)
PPT
Lua 语言介绍
PPT
实验五 读者 写者问题
PDF
Use Lambdas in Android
PDF
了解Php内核
PDF
Ecmascript
PPTX
JavaScript closures
PPTX
Javascript share
PPTX
5, initialization & cleanup
PDF
functional-scala
Sicmutils 介紹:Scmutils 的 Clojure 版函式庫
JAVA内存泄漏及诊断
Java 開發者的函數式程式設計
Jscex:案例、阻碍、体会、展望
Java华为面试题
Jscex:案例、经验、阻碍、展望
Hi Haskell
Js is js(程劭非) (1)
C python 原始碼解析 投影片
系統程式 -- 第 12 章 系統軟體實作
第01章 绪论(java版)
Lua 语言介绍
实验五 读者 写者问题
Use Lambdas in Android
了解Php内核
Ecmascript
JavaScript closures
Javascript share
5, initialization & cleanup
functional-scala
Ad

Viewers also liked (16)

PPTX
Fly fishing pictures
PDF
Work log photos
DOC
Complete banjo work log
PPT
Brookleigh Community Meeting 2-7-12
PDF
2013 03-08 [開発中] node-sacloud
PDF
なぜなに Windows Universal App (パイロット版)
PDF
2015/04/25 Azure JavaScript API App つくったよ (LT) / Global Azure Boot Camp
PPTX
5 string bluegrass banjo photo album slideshare
PDF
2015/04/25 妖怪は見た!実録Azure事件簿アプリケーション編 / Global Azure Boot Camp
DOC
Research paper
PPTX
5 string bluegrass banjo photo album slideshare
DOC
Updated bnjo work log with all opening for inputs
PDF
20120421 さくらのクラウドのコンパネをつくる話
PPTX
Acting on PhD student feedback to create new learning resources
PDF
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
DOCX
Athletic Training Research Paper
Fly fishing pictures
Work log photos
Complete banjo work log
Brookleigh Community Meeting 2-7-12
2013 03-08 [開発中] node-sacloud
なぜなに Windows Universal App (パイロット版)
2015/04/25 Azure JavaScript API App つくったよ (LT) / Global Azure Boot Camp
5 string bluegrass banjo photo album slideshare
2015/04/25 妖怪は見た!実録Azure事件簿アプリケーション編 / Global Azure Boot Camp
Research paper
5 string bluegrass banjo photo album slideshare
Updated bnjo work log with all opening for inputs
20120421 さくらのクラウドのコンパネをつくる話
Acting on PhD student feedback to create new learning resources
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
Athletic Training Research Paper
Ad

Similar to Js对象及函数式编程乱步 (20)

PPT
Java Script 引擎技术
PDF
高性能Javascript
PDF
高性能Javascript
PDF
Java script closures
PDF
iOs app 101
PDF
潜力无限的编程语言Javascript
PPTX
Js的国(转载)
PDF
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
DOC
Java面试题集
PDF
Clojure简介与应用
PDF
nodeMCU IOT教學02 - Lua語言
PDF
nodeMCU IOT教學02 - Lua語言
PPT
ios分享
PPTX
前端测试
PPTX
前端测试
PDF
JavaScript 教程
KEY
Scala
PPTX
Ecma script edition5-小试
PDF
學好 node.js 不可不知的事
PDF
JavaScript 技術手冊第 5 章
Java Script 引擎技术
高性能Javascript
高性能Javascript
Java script closures
iOs app 101
潜力无限的编程语言Javascript
Js的国(转载)
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Java面试题集
Clojure简介与应用
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
ios分享
前端测试
前端测试
JavaScript 教程
Scala
Ecma script edition5-小试
學好 node.js 不可不知的事
JavaScript 技術手冊第 5 章

Js对象及函数式编程乱步

  • 1. JS对象及函数式编程乱步 Alipay WD @晴川 on 2011-07-29 11年7月29日星期五 1
  • 6. JS的特点:入门易精通难 属于Java的部分 ⼀一切皆是对象(!特殊值 集合 数组) 封装与继承(!类) 属于Script的部分 独占式执行的脚本语言CSSL  与DOM关系密切(!Node.js) 11年7月29日星期五 6
  • 7. 编码规范和约定 为什么使用var定义变量 为什么使用{}代替new Object() 为什么使用[]代替new Array() 有哪些OOP原则值得借鉴 说"eval是恶魔"? 11年7月29日星期五 7
  • 8. 继续各种求解释 function average(x,y) { return (x+y)/2; } var z = average(1,3); var z = (function(x,y) { return (x+y)/2; })(1,3); 11年7月29日星期五 8
  • 9. 继续各种求解释 eval('(' + json + ')') 11年7月29日星期五 9
  • 10. 继续各种求解释 function foo(){ if(window===parent){ function bar(){alert(1);} } else{ function bar(){alert(2);} } bar(); } foo(); 11年7月29日星期五 10
  • 11. 继续各种求解释 for ( var i = 0; i < its.length; i++ ) { //(function(){ its[i].onclick = function(){alert(i);} //})(); } 11年7月29日星期五 11
  • 13. "函数是⼀一等公民" 匿名函数与命名函数 声明与表达式语句 ”(”和”)”构成⼀一个分组操作符,而分组操作符只 能包含表达式——匿名函数表达式 命名函数表达式——产生可靠的栈调用信息的唯 ⼀一途径 自执行匿名函数:(function(){})(); 11年7月29日星期五 13
  • 14. 函数的定义方式 函数声明: function Identifier ( FormalParameterList opt ) { FunctionBody } 函数表达式: function Identifier opt ( FormalParameterList opt ) { FunctionBody } ECMAScript 根据上下文来区分函数声明和函数表达式, 假设 "function test(){}" 是⼀一个表达式的⼀一部分, 它就是⼀一个函数表达式,否则它就是⼀一个函数声明。 11年7月29日星期五 14
  • 15. 函数的调用方式 1)全局函数 1)Global对象 2)对象方法 2)调用对象 3)构造函数 3)构造返回对象 4)apply/call调用 4)调用时传入的第⼀一个 参数 区别在于函数内this指 针的绑定—— 11年7月29日星期五 15
  • 17. "原型链" + "作用域链" 树遍历与链回溯 原型继承与实例构造 上下文与作用域 形参与实参 全局变量与局部变量 内部函数与外部函数 11年7月29日星期五 17
  • 19. "解析时"与"运行时" 活动对象 函数声明会在任何表达式被解析和求值之前先 行被解析和求值。 11年7月29日星期五 19
  • 21. "超空间"与生存期 渲染引擎与脚本引擎 11年7月29日星期五 21
  • 23. 用累加器做示例 function a() {     var i = 0; 内部函数     function b() { 外部函数         alert(++i);     } 局部变量     return b; } 内部函数在外部 var c = a(); 函数返回后被执 c(); 行 11年7月29日星期五 23
  • 24. 闭包 是⼀一个表达式(⼀一般是函数),它具有自由变 量以及绑定这些变量的环境(该环境“封闭 了”这个表达式)。 闭包封闭的外部变量就是自由变量,而由于该 自由变量存在,外部函数即便返回,其占用的 内存也得不到释放。 11年7月29日星期五 24
  • 26. 想想那些好用的方法 .sort() .each() .map() .grep() 11年7月29日星期五 26
  • 27. λ演算 (lambda calculus) 是⼀一套用于研究函数定义、函数应用和递归的 形式系统。Lambda演算可以被称为最小的通用 程序设计语言。 虽然 λ 演算并非设计来于计算机上运行,但可 视为第⼀一个函数式编程语言。 11年7月29日星期五 27
  • 28. 函数式编程 最古老的例子莫过于1958年被创造出来的LISP 了,通过 LISP,可以用精简的人力,实现通用 的程序设计。 较现代的例子包括Scheme、Haskell、Clean、 Erlang和Miranda等。 Scheme,是⼀一种多范型的编程语言,它是LISP 的两种主要的方言之⼀一。 11年7月29日星期五 28
  • 29. 柯里化 [CURRYING] 高阶函数 函数计算比代码运行重要 函数计算可做到随时调用 11年7月29日星期五 29
  • 30. function add(a, b) {     if (arguments.length < 1) {         return add;     } else if (arguments.length < 2) {         return function(c) {return a + c;}     } else {         return a + b;     } } 11年7月29日星期五 30
  • 31. function curry(func,args,space) {     var n  = func.length - args.length;     var sa = Array.prototype.slice.apply(args);     function accumulator(moreArgs,sa,n) {         var saPrev = sa.slice(0); // to reset         var nPrev  = n; // to reset         for(var i=0;i<moreArgs.length;i++,n--) {             sa[sa.length] = moreArgs[i];         }         if ((n-moreArgs.length)<=0) {             var res = func.apply(space,sa);             sa = saPrev;             n  = nPrev;             return res;         } else {             return function (){                 return accumulator(arguments,sa.slice(0),n);             }         }     }     return accumulator([],sa,n); } 11年7月29日星期五 31
  • 32. function add (a,b,c){       if (arguments.length < this.add.length) {         return curry(this.add,arguments,this);       }       return a+b+c; } alert(add()(1,2,4));      // 7 alert(add(1)(2)(5));      // 8 alert(add(1)()(2)()(6));  // 9 alert(add(1,2,7,8));      // 10 11年7月29日星期五 32
  • 33. function container() {     var secret = 100;     this.add = function (a,b,c){         if (arguments.length < this.add.length) {             return curry(this.add,arguments,this);         }         return a+b+c + secret;     }     this.adjustSecret =  function (n) { secret = n; }     this.giveSecret = function() { return secret; } } 11年7月29日星期五 33
  • 34. con = new container(); alert("secret is : "+con.giveSecret()); // check that value is indeed 100 curriedthingy = con.add(1,2);           // let's create a curried function alert(curriedthingy(4));                 // this alerts 107, as expected. con.adjustSecret(1000);                 // now, in the original con object, alert(curriedthingy(4));                 // and presto, it does. alerts 1007. 11年7月29日星期五 34
  • 35. 更多函数式编程示例 函数式编程语言的"Hello World" 程序是阶乘函 数。 http://zh.wikipedia.org/zh-cn/Hello_World 11年7月29日星期五 35