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)

另外一种给函数添加方法的代码为:

	var obj = {
		color: 'green'
	}
	function demo () {
		console.log(arguments)
		console.log(this.color)
	}

if(Function.prototype.bind === undefined){
    Function.prototype.bind = function (obj) {
        var paramArr = [].slice.call(arguments, 1);
        var that = this;
        return function () {
            that.apply(obj, paramArr.concat([].slice.call(arguments, 0)))
        }
    }
}
var curFn = demo.bind1(obj,1,1,1)
curFn(2,2)

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值