[TOC]

this的指向问题

问题1:this的指向(背诵)

或问:解释下JavaScript中this是如何工作
第一准则: this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。

(1) 普通的函数调用

函数被谁调用,this就是谁。

(2) 匿名函数或不处于任何对象中的函数指向window 。

(3) 如果是call, apply, bind,指定的this是谁,就是谁。

(4) 构造函数的this指向

构造函数的话,如果不用new操作符而直接调用,那即this指向window。用new操作符生成对象实例后,this就指向了新生成的对象。

(5) 箭头函数的this

由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值

// (1) 普通的函数调用
<script>
    // 例子1
    function test() {
        console.log(this); // this指向window,是因为window在调用test
    }

    window.test(); 


    // 例子2
    var obj = {
        name: '张三',
        say() {
            console.log(this.name);   // obj.say()结果是张三  fn()调用结果是
        }
    }
    obj.say(); // this指向obj

    // 将obj.say赋给了一个新的变量
    var fn = obj.say;
    window.fn();  // this指向window 
</script>

// (2) 匿名函数或不处于任何对象中的函数指向window 。
<script> 
    var obj = {
        say: function() {
            setTimeout(function() {
                console.log(this);  // this指向了window
            },1000);
        }
    }
    obj.say(); 
</script>

第12节 this指向 - 图1

问题2:call, apply和bind的区别

  1. 三者都会改变this的指向, 区别:
  2. call 和 apply 的功能相同,区别在于传参的方式不一样:
    1. call的第一个参数是this要指向的对象, 第二个,第三个….都是调用函数需要的参数。
    2. apply第一个参数是this要指向的对象, 第二个参数是数组或类数组, 数组是放的是调用函数需要的参数。 ``` // 1. 改变this的指向

// 2.call和apply传参


2. bind 和 call/apply 有一个很重要的区别,
   1. 一个函数被 call/apply 的时候,会直接调用,但是 bind 会创建一个新函数, 不会直接调用
   1. 当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this, 新函数的调用和原来函数的调用一模一样,除了this的指向不一样之外

```