神奇的call

Function.prototype.bind = function(){
var self = this, // 保存原函数 this代表func
//arguments 此时[obj,1,2]
//[].shift.call( arguments ), 意味将[]=arguments赋值,采用shift方法移除第一个并返回即obj
context = [].shift.call( arguments ), // 需要绑定的this 上下文,此时context =obj
//arguments 此时[1,2] obj已经被移除
args = [].slice.call( arguments ); // 剩余的参数转成数组,这个就有意思了slice是截取的意思,可以采用call方法却并没有传递start和end参数  ,[1,2,3].slice(1,2) 从第1个开始到第二结束,返回1 ,var ar=['a','b'];ar.slice.call( [3,4] );alert(ar);结果 [3,4]
return function(){ // 返回一个新的函数
//arguments 此时[3, 4] ,func( 3, 4 )函数传入的
return self.apply( context, [].concat.call( args, [].slice.call( arguments ) ) );//意思将args和arguments 合并然后作为apply的第二个参数
// 执行新的函数的时候,会把之前传入的context 当作新函数体内的this
// 并且组合两次分别传入的参数,作为新函数的参数
}
};
var obj = {
name: 'sven'
};
var func = function( a, b, c, d ){
alert ( this.name ); // 输出:sven
alert ( [ a, b, c, d ] ) // 输出:[ 1, 2, 3, 4 ]
}.bind( obj, 1, 2 );
func( 3, 4 );

猜你喜欢

转载自blog.csdn.net/losedguest/article/details/82025611