1. 程式人生 > >js中的bind方法的實現方法

js中的bind方法的實現方法

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)