js中的bind方法的實現方法
阿新 • • 發佈:2018-12-14
js中目前我遇見的改變作用域的5中方法:call, apply, eval, with, bind。
var obj = {
color: 'green'
}
function demo () {
console.log(arguments)
console.log(this.color)
}
var newFn = demo.bind(obj,1,1,1)
newFn(2,2,2)
bind改變函式作用域的方式和call和apply的不同點在於,call和apply是改變作用域的同時也會執行函式。而bind改變作用域會生成一個新函式,是否執行可以根據具體需求設定。
模擬這個bind方法的程式碼如下:
var obj = { color: 'green' } function demo () { console.log(arguments) console.log(this.color) } /* * bind1 模擬bind方法 * @fn 需要執行的函式 * @obj 傳入的作用域 */ var bind1 = function (fn, obj){ //取從索引值為2開始的後邊的所有引數,生成陣列 var paramArr = [].slice.call(arguments,2); return function(){ //拼接兩次傳入的除了fn和作用域之後的引數 fn.apply(obj, paramArr.concat([].slice.call(arguments,0))) } } var curFn = bind1(demo, obj, 3,3,3) curFn(4,4,4)