一、js编程特点:
(1)函数式编程 + 面向对象编程的混编语言
(2)可扩展性强 :参数个数不限,参数数据类型不限(js是松散型语言,声明变量时,不用声明数据类型)
有点: 灵活,易学
缺点: 不可控
二、函数式编程与面向对象编程
函数式编程很常用到,面向对象不一定。前端工程师更倾向函数式编程。
面向对象所面临的技术: this指向 => call apply bind,this太多会变得混乱。但是也不能解决所有问题,需要用到函数式编程。
// html
// <div class='button'><div>
// <p class='p' >123<p>
// script
function Test(){
this.button = document.getElementByClassName('button')[0];
this.p = document.getElementByClassName('p')[0];
this.content = 678;
}
Test.prototype.init = function(){
this.bindEvent()
}
Test.prototype.bindEvent = function (){
this.button.addEventListener('click',this.emitEvent.bind(this),false)
}
Test.prototype.emitEvent = function (){
let text = this.content,
pInnerHtml = this.p.innerHtml;
this.pInnerHtml = this.text
console.log(this) //=> 事件触发dom节点
}
new Test().init()
什么场景使用面向对象合适呢 : 高度复用,多个地方都会用到新实例的时候。没有高度复用的话,就错失了面向对象的精髓。
三、函数式编程
特点:易读、易维护。
理念:函数式编程中,函数是第一类对象,不依赖其他对象独立存在。
(1)纯函数:输入有着对应着的输出,不依赖不影响外部环境(不产生副作用)。
let a = 1;
function test(){
console.log(a)
}
test()
// 上面函数依赖着外部变量
let a = 1;
function test(num){
console.log(num + 123)
}
test(a)
//输出对应着输入,对外界没有依赖
(2)函数副作用: 可能产生问题的行为<br />数据请求、dom操作、外部数据改变、操作数据存储、console.log(依赖外部函数)<br />splice和slice<br />splice改变原数组,返回删除的元素。不是纯函数,js自身就提供了非纯函数,所以js编程中没有一定要使用纯函数。<br />slice截取范围内元素,返回新数组,不改变原函数。纯函数
function compute(a,b,foo){
let typeValid = (typeof a) === 'number' && (typeof b) === 'number';
if( typeValid ){
return foo(a,b)
}else{
console.log('a和b需要都为数字')
}
}
//这种函数不需要依赖外部变量,所以可移植
function add (a,b){
return a + b
}
compute(1,6,add)
纯函数好处:
(1)可移植,内部对外界的依赖,所以放到哪里都可以执行。
(2)易读,没有对外界的依赖,所以透明易读。
(3)可缓存
实际开发中,没有必要一定用纯函数,可提纯就提纯。
缓存池
function test(fn){
let cache = {};
return function(){
//普通对象中,不能用引用类型作为箭名。es6中的map可以
let arg = JSON.stringify(arguments),
result = cache[arg] ? ( cache[arg] + '来自缓存池' ) : fn(arguments);
if(!cache[arg]){
cache[arg] = result
}
return result
}
}
function computation (arguments){
//这里的形参arguments,是从其他地方传过来的arguments对象
console.log(arguments)
let sum = [...arguments].reduce((accumulator,elem)=>{
return accumulator + elem
},0)
return sum
}
var computor = test(computation)
console.log(computor(1,2,3,4,5,6))
console.log(computor(1,2,3,4,5,6))
函数式编程核心:
函数提纯:拆分抽象,功能单一,不要太臃肿,参数多了可以传配置项。目的就是,易读,易维护(有修改,直接找到对应函数就可以完成修改)。
书籍知识点补充:
晌应式编程,这种编程范式有助于数据流的处理和变化的传递。
设计程序时,我们应该思考:
(1)可扩展性 一一 拓展功能的时候,是否需要重构代码?
(2)模块化 一一 修改一个文件,是否会影响到其他文件?
(3)可用性 一一 是否有重复代码?
(4)易测性 一一 能否执行单元测试?
(5)易读性 一一 阅读起来是否难以理解?