js中的call()
, apply()
和bind()
是Function.prototype
下的方法,都是用于改变函数运行时上下文,最终的返回值是你调用的方法的返回值,若该方法没有返回值,则返回undefined。这几个方法很好地体现了js函数式语言特性,在js中几乎每一次编写函数式语言风格的代码,都离不开call和apply,可以熟练运用它们,是真正成为一名jser程序员的重要一步。javascript
使用 apply, 你能够继承其余对象的方法:java
var max = Math.max.apply(null, [1, 2, 3, 4, 5]); console.log(max); // 输出5
注意这里apply()
的第一个参数是null
,在非严格模式下,第一个参数为null
或者undefined
时会自动替换为指向全局对象,apply()
的第二个参数为数组或类数组。程序员
call()
是apply()
的一颗语法糖,做用和 apply()
同样,一样可实现继承,惟一的区别就在于call()
接收的是参数列表,而apply()
则接收参数数组。数组
var max = Math.max.call(null, 1, 2, 3, 4, 5); console.log(max); // 输出5
bind()
的做用与call()
和apply()
同样,都是能够改变函数运行时上下文,区别是call()
和apply()
在调用函数以后会当即执行,而bind()
方法调用并改变函数运行时上下文后,返回一个新的函数,供咱们须要时再调用。app
var person = { name: 'person', getName: function() { return this.name; } } var boy = { name: 'twy' } // bind()返回一个新函数,供之后调 var getName = person.getName.bind(boy); // 如今调用 console.log(getName()); // 输出wy
用apply()
模拟实现bind()
:函数
Function.prototype.bind = function(context) { // 保存调用函数的引用,这里是getName() var self = this; // 返回一个新函数 return function(){ return self.apply(context, arguments); } } var person = { name: 'twy' } var getName = function(){ console.info(this.name); }.bind(person); // 执行bind()方法内返回的新函数 getName();
在返回的新函数内部,self.apply(context, arguments)
才是执行原来的getName
函数,至关于执行getName.apply(person)
;this
apply()
;call()
;bind()
;call()
、apply()
和bind()
都是用来改变函数执行时的上下文,可借助它们实现继承;call()
和apply()
惟一区别是参数不同,call()
是apply()
的语法糖;bind()
是返回一个新函数,供之后调用,而apply()
和call()
是当即调用。