9.5.1、改变函数中this指向

1、call

  1. var name="王五"
  2. var obj = { name:"李四" }
  3. function go(){
  4. console.log(this.name);
  5. }
  6. go() // 王五
  7. go.call(obj) // 李四

2、apply

  1. var name="window"
  2. var zhang={
  3. name:"张三"
  4. }
  5. function show(a,b){
  6. console.log(this.name);
  7. console.log(a+b);
  8. }
  9. show(1,2)
  10. show.call(zhang,2,3)
  11. show.apply(zhang,[1,2])

3、bind

  1. bind 绑定的函数不会马上执行,只是改变了函数上下文的执行环境
  2. callapply调用的时候马上执行
  1. var name = "window"
  2. var zhang = {
  3. name:"张三"
  4. }
  5. var show = function (a,b){
  6. console.log(this.name);
  7. console.log(a+b);
  8. }.bind(zhang)
  9. show(2,3) // zhang 5

4、call和apply的区别

  1. callapply的区别:
  2. 应用场景:传递多个参数的情况
  3. call依次去传递
  4. apply 需要传递数组

9.5.2、使用场景

解决定时器中this的指向问题

  1. <button id="btn">按钮</button>
  2. <script>
  3. var id="1001";
  4. var btn = document.getElementById("btn")
  5. btn.onclick = function(){
  6. setTimeout(function(){ // window.setTimeout
  7. console.log(this.id); // 1001
  8. },1000)
  9. }
  10. </script>

1、用bind解决

  1. btn.onclick = function(){
  2. setTimeout(function(){
  3. console.log(this.id);
  4. }.bind(btn),1000)
  5. }
  6. /* btn.onclick = function(){
  7. var self = this
  8. setTimeout(function(){
  9. console.log(this.id);
  10. }.bind(self),1000)
  11. }
  12. btn.onclick = function(){
  13. setTimeout(function(){
  14. console.log(this.id);
  15. }.bind(this),1000)
  16. }

2、使用箭头函数解决

  1. btn.onclick = function(){
  2. setTimeout(()=>{
  3. console.log(this.id);
  4. },1000)
  5. }