SlideShare a Scribd company logo
1 of 35
Download to read offline
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

What's hot

Sicmutils 介紹:Scmutils 的 Clojure 版函式庫
Sicmutils 介紹:Scmutils 的 Clojure 版函式庫Sicmutils 介紹:Scmutils 的 Clojure 版函式庫
Sicmutils 介紹:Scmutils 的 Clojure 版函式庫睿麒 王
 
JAVA内存泄漏及诊断
JAVA内存泄漏及诊断JAVA内存泄漏及诊断
JAVA内存泄漏及诊断ivannotes
 
Java 開發者的函數式程式設計
Java 開發者的函數式程式設計Java 開發者的函數式程式設計
Java 開發者的函數式程式設計Justin Lin
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望jeffz
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望jeffz
 
Js is js(程劭非) (1)
Js is js(程劭非) (1)Js is js(程劭非) (1)
Js is js(程劭非) (1)looneyren
 
C python 原始碼解析 投影片
C python 原始碼解析 投影片C python 原始碼解析 投影片
C python 原始碼解析 投影片kao kuo-tung
 
系統程式 -- 第 12 章 系統軟體實作
系統程式 -- 第 12 章 系統軟體實作系統程式 -- 第 12 章 系統軟體實作
系統程式 -- 第 12 章 系統軟體實作鍾誠 陳鍾誠
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
Lua 语言介绍
Lua 语言介绍Lua 语言介绍
Lua 语言介绍gowell
 
实验五 读者 写者问题
实验五 读者 写者问题实验五 读者 写者问题
实验五 读者 写者问题jason1114
 
Use Lambdas in Android
Use Lambdas in AndroidUse Lambdas in Android
Use Lambdas in Androidkoji lin
 
了解Php内核
了解Php内核了解Php内核
了解Php内核Er Zhang
 
Ecmascript
EcmascriptEcmascript
Ecmascriptjay li
 
JavaScript closures
JavaScript closuresJavaScript closures
JavaScript closuresHorky Chen
 
Javascript share
Javascript shareJavascript share
Javascript shareXu Mac
 
5, initialization & cleanup
5, initialization & cleanup5, initialization & cleanup
5, initialization & cleanupted-xu
 

What's hot (20)

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

Viewers also liked

Fly fishing pictures
Fly fishing picturesFly fishing pictures
Fly fishing picturescolerchrds
 
Work log photos
Work log photosWork log photos
Work log photossa10074
 
Complete banjo work log
Complete banjo work logComplete banjo work log
Complete banjo work logfenderleo2
 
Brookleigh Community Meeting 2-7-12
Brookleigh Community Meeting 2-7-12Brookleigh Community Meeting 2-7-12
Brookleigh Community Meeting 2-7-12Kathleen Boettcher
 
2013 03-08 [開発中] node-sacloud
2013 03-08 [開発中] node-sacloud2013 03-08 [開発中] node-sacloud
2013 03-08 [開発中] node-sacloudYuki KAN
 
なぜなに Windows Universal App (パイロット版)
なぜなに Windows Universal App (パイロット版)なぜなに Windows Universal App (パイロット版)
なぜなに Windows Universal App (パイロット版)Yuki KAN
 
2015/04/25 Azure JavaScript API App つくったよ (LT) / Global Azure Boot Camp
2015/04/25 Azure JavaScript API App つくったよ (LT) / Global Azure Boot Camp2015/04/25 Azure JavaScript API App つくったよ (LT) / Global Azure Boot Camp
2015/04/25 Azure JavaScript API App つくったよ (LT) / Global Azure Boot CampYuki KAN
 
5 string bluegrass banjo photo album slideshare
5 string bluegrass banjo photo album slideshare5 string bluegrass banjo photo album slideshare
5 string bluegrass banjo photo album slidesharefenderleo2
 
2015/04/25 妖怪は見た!実録Azure事件簿アプリケーション編 / Global Azure Boot Camp
2015/04/25 妖怪は見た!実録Azure事件簿アプリケーション編 / Global Azure Boot Camp2015/04/25 妖怪は見た!実録Azure事件簿アプリケーション編 / Global Azure Boot Camp
2015/04/25 妖怪は見た!実録Azure事件簿アプリケーション編 / Global Azure Boot CampYuki KAN
 
Research paper
Research paperResearch paper
Research paperemmaboo2
 
5 string bluegrass banjo photo album slideshare
5 string bluegrass banjo photo album slideshare5 string bluegrass banjo photo album slideshare
5 string bluegrass banjo photo album slidesharefenderleo2
 
Updated bnjo work log with all opening for inputs
Updated bnjo work log with all opening for inputsUpdated bnjo work log with all opening for inputs
Updated bnjo work log with all opening for inputsfenderleo2
 
20120421 さくらのクラウドのコンパネをつくる話
20120421 さくらのクラウドのコンパネをつくる話20120421 さくらのクラウドのコンパネをつくる話
20120421 さくらのクラウドのコンパネをつくる話Yuki KAN
 
Acting on PhD student feedback to create new learning resources
Acting on PhD student feedback to create new learning resourcesActing on PhD student feedback to create new learning resources
Acting on PhD student feedback to create new learning resourcesLUL Sci-Eng Team
 
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
17 E-5 震災とHackとクラウドと ━ URIベースのCSLBYuki KAN
 
Athletic Training Research Paper
Athletic Training Research PaperAthletic Training Research Paper
Athletic Training Research Papersa10074
 

Viewers also liked (16)

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

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

Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
高性能Javascript
高性能Javascript高性能Javascript
高性能Javascriptfangdeng
 
高性能Javascript
高性能Javascript高性能Javascript
高性能Javascriptfangdeng
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
iOs app 101
iOs app 101iOs app 101
iOs app 101Tom Sun
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Js的国(转载)
Js的国(转载)Js的国(转载)
Js的国(转载)Leo Hui
 
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫Justin Lin
 
Java面试题集
Java面试题集Java面试题集
Java面试题集yiditushe
 
Clojure简介与应用
Clojure简介与应用Clojure简介与应用
Clojure简介与应用Robert Hao
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程Bobby Zhou
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试lydiafly
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章JavaScript 技術手冊第 5 章
JavaScript 技術手冊第 5 章Justin Lin
 

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

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