call,apply和bind

版权声明:转载请注明出处 https://blog.csdn.net/Cathence/article/details/82838799

apply

用途:在特定的作用域中调用函数,实际上等于设置函数体内this对象的值
第一个参数:在其中运行函数的作用域
第二个参数:参数数组
(详细用法可以参考另外一篇文章:深入理解apply

call

和apply()方法类似,唯一区别是:
apply()把参数打包成Array再传入,call()把参数按顺序传入
如:

Math.max.apply(null, [3, 5, 4]);  //5
Math.max.call(null, 3, 5, 4); //5

bind

将函数绑定到指定环境

一个简单的bind()函数接受一个函数和一个环境,并返回一个在给定环境中调用给定环境的函数,并且将所有参数原封不动传递过去。

语法:

function bind(fn, context0 {
	return function() {
		return fn.apply(context, arguments);
	};
}

在bind()中创建了一个闭包,闭包使用apply()调用传入的函数,并给apply()传递context对象和参数。arguments对象是内部函数的,并非bind()的,当调用返回的函数时,它会在给定环境中执行被传入的函数病给出所有参数。(高程)

可以从以下例子中区别call,apply,bind

情景:
已知函数fn执行需要3个参数,请实现函数parcial。调用之后满足:
1)返回一个函数result,该函数接受一个参数
2)执行result(str3),返回的结果是与fn(str1,str2,str3)一致。

  • call和apply必须显式地调用str3,立即执行
  • bind不是立即执行,未传入str3时,并未执行,只是返回一个函数,等待参数传入
  • this用于上下文不确定的情况

call:

function parcial(fn, str1,str2) {
	function result(str30) {
		return fn.call(this,str1,str2,str3);
	}
	return result;
}

apply:

function parcial(fn, str1, str2) {
	function result(str3) {
		return fn.apply(this,[str1, str2, str3]);
	}
	return result;
}

bind:

function parcial(fn, str1, str2) {
	return fn.bind(this, str1, str2);
}

这个bind会生成一个新函数(对象),它的str1,str2参数是定死的,str3未传入,一旦传入就会执行

function partial(fn, str1, str2) {
	function result(str3) {
		return fn.bind(this,str1,str2)(str3);
	}
	return result;
}

把str3传入的过程写在另一个函数里面,而另外一个函数也有str1,str2参数,跟上面一种写法有多此一举的感觉,但是可以体现出后续的调用,以及和apply,call的比较。

bind不加后面的括号返回的是函数,加上后面的括号返回的是函数值,这也是bind和call和apply的主要区别。
bind需要二次调用,而call和apply返回的是函数值,直接调用。

整理自:牛客网

猜你喜欢

转载自blog.csdn.net/Cathence/article/details/82838799