JS基础(五)
分类:javascript
JS基础知识5
关于闭包的一些进阶
1.惰性函数
所谓惰性函数就是有些条件能执行一次就执行一次,绝不执行多次
var time = null
var fn = function() {
if (!time) {
return time = 2
} else {
return time += 1
}
}
fn()
fn()
fn()
我们会发现其实在第一次执行这个函数的时候,time的值就不再是null了,但是后面的调用我们依然会去判断time的值是否存在,这就感觉很"勤快",为了懒一点我们改造一下:
var time = null
var fn = function() {
time = 2
fn = function() {
time += 1
}
return time
}
fn()
fn()
fn()
像这样我们在第一次执行完后,就把函数给改了,以后再也不用在担心要多做一个判断了
2.柯理化函数
柯理化函数是啥呢?百度百科这么说:柯理化函数是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
简单举个例子:
function add(a, b) {
return a + b
}
console.log(add(1,2))
function addCurry(a) {
return function(b) {
return a + b
}
}
console.log(addCurry(1)(2))
这就是把复杂变简单,通俗的讲,一道很难的数学题,一般会给好几问,而下一问的求解通常会用到上一问算出的结果。这种渐进式的解题方法会大大提高解题的速度和难度。而柯理化就是这一思想,将复杂的问题拆分成一个个小问题,进而来求解。
而关于柯理化又到金典的面试题:
let res = fn(1, 2)(3)
// 使 res 的结果等于6
这里虽然是最多只有两个参数,但是我们可以拓展成多参的形式,解面试题不都是这样,不光要对,还要通用型
function fn() {
let arg = Array.from(arguments)
return function() {
let arg1 = Array.from(arguments)
let arr = arg.concat(arg1)
console.log(arr.reduce((result, item, index)=> {
return result + item
}))
// console.log(eval(arr.join('+')));
}
}
至于柯理化函数的意义,就不展开了,有兴趣可以知乎一下