2rever的前端小站

bind方法实现(不考虑this)

Word count: 216 / Reading time: 1 min
2018/10/23 Share

bind函数

1
2
3
4
5
6
//bind的实现
function bind(f,...fixedArgs){
return function(...args){
return f(...fixedArgs,...args)
}
}
1
2
3
4
5
6
7
8
9
//bind原来的实现
function bind(f) {
var fixedArgs = Array.from(arguments).slice(1)
return function() {
var args = Array.from(arguments)
var allArgs = fixedArgs.concat(args)
return f.apply(null, allArgs)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function bind(fn,thisVal,...fixedArgs){
return function(...args){
var argList = []
var i = 0
fixedArgs.forEach(arg => {
if (arg === window) {
argList.push(args[i++])
}else{
argList.push(arg)
}
})
argList.splice(argList.length,0,...args.slice(i))
return fn(...argList)
}
}
1
2
3
4
5
function bind(f, thisVal, ...bindedArgs) {
return function(...args) {
return f.call(thisVal, ...bindedArgs, ...args)
}
}
1
2
3
4
5
6
7
8
9
10
11
function bind(f, thisVal) {
var bindedArgs = [].slice.call(arguments).slice(2)
return function() {
if (没被当构造函数调用) {
var args = [].slice.call(arguments)
return f.apply(thisVal, bindedArgs.concat(args))
} else {
return new f(bindedArgs.concat(args))
}
}
}
  • TODO:由bind返回的函数被当做构造函数调用时,this的绑定会失效。
CATALOG
  1. 1. bind函数