apply()、call()、bind()
每个Function
对象都存在apply()
、call()
、bind()
方法,其作用都是可以在特定的作用域中调用函数,等于设置函数体内this
对象的值,以扩充函数赖以运行的作用域。
使用
apply()
、call()
、bind()
都能改变函数对象的this
指向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| window.name = "A"; document.name = "B"; var s = { name: "C" }
var rollCall = { name: "Teacher", sayName: function(){ console.log(this.name); } } rollCall.sayName();
rollCall.sayName.apply(); rollCall.sayName.apply(window); rollCall.sayName.apply(document); rollCall.sayName.apply(s);
rollCall.sayName.call(); rollCall.sayName.call(window); rollCall.sayName.call(document); rollCall.sayName.call(s);
rollCall.sayName.bind()(); rollCall.sayName.bind(window)(); rollCall.sayName.bind(document)(); rollCall.sayName.bind(s)();
|
区别
虽然apply()
、call()
、bind()
都能够达到改变this
指针的目的,但是其使用还是有区别的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| window.name = "Teacher"; var rollCall = { sayAllName: function(...args){ console.log(this.name); args.forEach((v) => console.log(v)); } }
rollCall.sayAllName.apply(window,["A","B","C"]);
rollCall.sayAllName.call(window,"A","B","C");
var convertThis = rollCall.sayAllName.bind(window,"A","B","C"); convertThis();
|