Module: functions
扩展函数能力的函数
Functions
after
▸ after(fn
, count?
): Function
创建一个包含指定函数逻辑且内置计数的包装函数并返回。 该函数每调用一次计数会减一,直到计数为0后生效。可用于异步结果汇总时只调用一次的场景
Example
//undefined, undefined, 'data saved'let saveTip = _.after(()=>'data saved',2);console.log(saveTip(),saveTip(),saveTip())
Parameters
Name | Type | Description |
---|---|---|
fn | Function | 需要调用的函数 |
count? | number | 计数 |
Returns
Function
包装后的函数
alt
▸ alt(v
, interceptor1
, interceptor2
): any
传递v为参数执行interceptor1函数,如果该函数返回值未定义(undefined)则执行interceptor2函数,并返回函数返回值。 用于函数链中的分支操作
Example
//falseconsole.log(_.alt(9,v=>false,v=>20))
Parameters
Name | Type | Description |
---|---|---|
v | unknown | |
interceptor1 | Function | (v) |
interceptor2 | Function | (v) |
Returns
any
函数返回值
bind
▸ bind(fn
, thisArg
, ...args?
): Function
创建一个新的函数,并且绑定函数的this上下文。默认参数部分同partial()
Example
const obj = { text:'Func.js', click:function(a,b,c){console.log('welcome to '+this.text,a,b,c)}, blur:function(){console.log('bye '+this.text)}}//自动填充参数let click = _.bind(obj.click,obj,'a',undefined,'c');click('hi')//1秒后执行,无参数setTimeout(click,1000)
Since
0.17.0
Parameters
Name | Type | Description |
---|---|---|
fn | Function | 需要调用的函数 |
thisArg | unknown | fn函数内this所指向的值 |
...args? | any | 参数可以使用undefined作为占位符,以此来确定不同的实参位置 |
Returns
Function
绑定this的新函数
bindAll
▸ bindAll(object
, ...methodNames
): Record
<UnknownMapKey
, any
>
批量绑定对象内的函数属性,将这些函数的this上下文指向绑定对象。经常用于模型中的函数用于外部场景,比如setTimeout/事件绑定等
Example
const obj = { text:'Func.js', click:function(a,b,c){console.log('welcome to '+this.text,a,b,c)}, click2:function(){console.log('hi '+this.text)}}//自动填充参数_.bindAll(obj,'click',['click2']);//1秒后执行,无参数setTimeout(obj.click,1000)//事件top.onclick = obj.click2
Since
0.17.0
Parameters
Name | Type | Description |
---|---|---|
object | Record <UnknownMapKey , any > | 绑定对象 |
...methodNames | (string | string ) | 属性名或path |
Returns
Record
<UnknownMapKey
, any
>
绑定对象
compose
▸ compose(...fns
): Function
创建一个新的函数,该函数的参数会传递给第一个fns
函数来计算结果,而结果又是第二个fns函数的参数,以此类推,
直到所有函数执行完成。常用于封装不同的可重用函数模块组成新的函数或实现惰性计算,比如
let checkName = _.compose(_.trim,v=>v.length>6); checkName(' holyhigh') //=> true checkName(' ') //=> false
Example
// Holyhighlet formatName = _.compose(_.lowerCase,_.capitalize);console.log(formatName('HOLYHIGH'))
Parameters
Name | Type |
---|---|
...fns | Function |
Returns
Function
组合后的入口函数
delay
▸ delay(fn
, wait?
, ...args?
): Timeout
启动计时器,并在倒计时为0后调用函数。 内部使用setTimeout进行倒计时,如需中断延迟可以使用clearTimeout函数
Example
//1000ms 后显示some text !_.delay(console.log,1000,'some text','!');
Parameters
Name | Type | Description |
---|---|---|
fn | Function | 需要调用的函数 |
wait? | number | 倒计时。单位ms |
...args? | any | 传入定时函数的参数 |
Returns
Timeout
计时器id
fval
▸ fval<T
>(expression
): T
类似eval,对表达式进行求值并返回结果。不同于eval,fval()执行在严格模式下
注意,如果页面设置了CSP可能会导致该函数失效
Example
//5console.log(_.fval('3+2'));//{name:"func.js"}console.log(_.fval("{name:'func.js'}"));
Type parameters
Name |
---|
T |
Parameters
Name | Type | Description |
---|---|---|
expression | string | 计算表达式 |
Returns
T
表达式计算结果
once
▸ once(fn
): Function
创建一个包含指定函数逻辑的包装函数并返回。该函数仅执行一次
Example
//2748, undefinedlet parseInt2 = _.once(parseInt);console.log(parseInt2('abc',16),parseInt2('abc',16))
Parameters
Name | Type | Description |
---|---|---|
fn | Function | 需要调用的函数 |
Returns
Function
包装后的函数
partial
▸ partial(fn
, ...args
): Function
创建一个新的函数,该函数会调用fn,并传入指定的部分参数。
partial()
常用来创建函数模板或扩展核心函数,比如
let delay2 = _.partial(setTimeout,undefined,2000);delay2(()=>\{console.log('2秒后调用')\})
Example
//2748let hax2num = _.partial(parseInt,undefined,16);console.log(hax2num('abc'))//9let square = _.partial(Math.pow,undefined,2);console.log(square(3))//¥12,345.00元let formatYuan = _.partial(_.formatNumber,undefined,'¥,000.00元');console.log(formatYuan(12345))//[func.js] hi...let log = _.partial((...args)=>args.join(' '),'[func.js][',undefined,']',undefined);console.log(log('info','hi...'))
Parameters
Name | Type | Description |
---|---|---|
fn | Function | 需要调用的函数 |
...args | any | 参数可以使用undefined作为占位符,以此来确定不同的实参位置 |
Returns
Function
部分应用后的新函数
tap
▸ tap<T
>(v
, interceptor
): T
传递v为参数执行interceptor函数,然后返回v。常用于函数链的过程调试,比如在filter后执行日志操作
注意,一旦函数链执行了shortcut fusion,tap函数的执行会延迟到一个数组推导完成后执行
Example
//shortut fusion中的tap只保留最后一个_([1,2,3,4]).map(v=>v*3).tap(v=>console.log(v))//被覆盖.filter(v=>v%2===0).tap(v=>console.log(v))//会延迟,并输出结果[6,12].join('-').value()
Type parameters
Name |
---|
T |
Parameters
Name | Type | Description |
---|---|---|
v | T | |
interceptor | Function | (v);如果v是引用值,改变v将影响后续函数流 |
Returns
T
v