4、显示绑定
指的是apply、bind、call
(1)、apply 和 call
相同点: <1> 这两个方法的用途是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值,真正强大之处在于扩充函数赖以运行的作用域
<2> 它们接收的第一个参数都是一样的:函数运行的作用域
区别:apply 接收的参数是一个数组或者是类数组(arguments),call需要把接收的参数一一列举出来
这个 call 接受的参数是可枚举的:
function foo(b,c){ console.log(this.a,b,c); } var obj = { a:2,b:3} foo.call(obj,5,6) // 2 5 6
apply接受的参数是数组或者 arguments
function foo(something){ console.log(this.a,something); // 2 3 return this.a + something } var obj = { a:2} var bar =function(){ return foo.apply(obj,arguments); } var b = bar(3) console.log(b) // 5
apply 还有一个作用是把数组展开
function f(x,y,z){ console.log(x,y,z); // 1,2,3 } var a = [1,2,3] f.apply(null,a)
这个是ES5中的写法,在 ES6 中已经抛弃了这种写法,ES6 的写法为:
function f(x,y,z){ console.log(x,y,z); // 1,2,3 } var a = [1,2,3] f(...a)
(2)bind
MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数 加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
function foo(something){ console.log(this.a,something); // 2 5 return this.a + something } var obj = { a:2} var bar = foo.bind(obj,5) // 这个东西是函数 foo var b = bar(3) console.log(b); // 7
5、优先级问题
new > 显示绑定 > 隐式绑定 > 默认
call、apply、bind其实不止用于指定this,还有很多的用途。在这因为是讲 this 所以就不谈那些,后续我会继续写一些 this 的机制,以及前人是怎么替代 this 机制的。嗯.....
因为刚开始写东西,所以可能有些东西表达的不是很清楚,可能有些东西看起来有点绕,如果有什么不懂得或者有问题的欢迎留言指正