您的位置:首页 > Web前端 > JavaScript

JS is JS——编写JS独有风格的JS代码 学习笔记

2011-12-24 23:25 162 查看
JS is JS

来自程劭非的讲座。。。 地址http://www.infoq.com/cn/presentations/csf-js-style-code

JS 之父 Brandan Eich

My influences were awk,C,HyperTalk,and Self,commined with management orders to "make it look like java "

被管理层命令让他看上去像Java

management 管理者

prototype 来自于Self

Agenda 议程

抽象

1、简化 抽象的方法

将复杂物体的一个或几个特性抽出去,而自注意其他特性的行动或过程

举例:手里的遥控器,不管它用什么材料做,只把它当按钮来使。。。 视而不见

毛主席说:千万不要忘记阶级斗争。

解放前贫农张大伯被地主“钱剥皮”借钱3元,被勒索"月三分“(每月利息是上月的30%)十个月后才还清,被剥削了多少钱利息?

function caculate(){

  return 3*Math.pow(1.3,10)-3; //运算,,

}   //简化,是抽象的方法

有选择的丢弃或是忘记。 客户要开发的项目,分析出什么是它想要的。

2、归纳

将几个有区别的物体的共同性质或特征,形象的抽取出来或孤立的进行考虑的行动或过程。

抽象的不同取决于你的场景,和你的业务逻辑

例子:美女,在骨科代夫看的是骨头,在我们眼里是另一种。

例子,每个学生分3个苹果,总共要几个?

function totalApples(count) {

  return count* count;  

}

程序正确,并不一定抽象正确

代码要重构,或觉得差,很大部分因为抽象不对

没想好,或业务在变化

function Apple(){

}

function Kid() {

  this.apples = [];

  this.recevieApple = function(){

    apples.push(apple);

  }

}

function Teacher(){

  this.dispatchApple = function(kid) {

    kid.receiveApple(kid);

    kid.receiveApple(kid);

    kid.receiveApple(kid);

  }

}

function totalApples() {

  var kids = [new Kid(),new Kid(),new Kid()];

  var teacher = new Teacher();

  kids.forEach(function(kid){

  });

}

过于具体

JS有三大范式

面向过程抽象

最最基础,最最重要的一种抽象

过程是事种最常见的抽象,但它不完整

程序 = 数据+过程

过程不是一种落后的编程范式

理论上讲,过程不需要要有参数,,,但也可以有

不太关注返回值,只是去改变数据

全局或局部

函数和过程结合

var data1,data2,data3;

function process_main() {

  data1 = ;

  process1();

  process2();

  function process1() {

  }  

  function process2(){}

}  

面向对象

对象是一个朴素的概念,大约在2-3岁产生

JS中描述独立对象JSON

分类描述对象

function Parent() {

}

function Child(x) {

  Parent.call(this);

  this.x = x;

}

面向对象 原型

比猫大,头上有个王字, 上树抛异常

跟小孩讲,,好例子。

function Cat() {}

function Triger() {

  this.draw("王")

}

Triger.prototype = new Cat();

原型是一种比较随意的代码组织方式,,,不好读,好写. 复用不要求那么高,,它是很快的

原型也可以很严谨, 自律

JS里不需要有new 的,,

原型不是类,共有的原型,

函数式抽象

Lambda 演算

其实就是替换

函数式编程以演算为基础

函数是第一型 Fist Class

能做参数

能做为返回值

能赋值给变量

有直接量

能运行时产生

例子,,,,加法定义乘法

function add(a,b) {

  return a +b ;  

}

function mul(a,b) {

   var r = a;

  for (var i = 1;i<b;i++) {

    r = add(r,a)

  }

  return r;

}  

闭包 Lexical Closcure 词法性 运行时会被绑定到不同的变量去,赋与不同的含义

好处,,,更加灵活

柯里化 Currying

f(a,b,c)

f(a) ; 抛出异常???

f2 = f(a);

f2 (b,c)

返回一个函数,接受这两个参数
设计函数式API

OO is poor man's closoure

function addEventListener (node ,type ,lisenter) { }

var node = new Node();

var addEventListenerToNode = addEventListener(node);

addEventListenerToNode(type,listener);

函数式和Javascript里的函数不一致,,,它是一种只关注输入输入出的风格

要能用闭包,currying ,一等化

循环也用递归去表达 js 性能跟不上去

引入一些函数式特性

比如排序, 传入一个函数做参数进去,正排返排

创建你独有风格

jQuery 链式表达 声明式编程

命名空间,脱离语言束缚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: