1 默认绑定

函数在一般调用时执行环境时window,所有this指向window

function fn(){
     console.log(this)
}
fn()

2 立即执行函数的this默认指向window

var name = 'wbb'
    !(function () {
        alert(this.name)
    })()

3 闭包得this指向window

var name = 'wbb'
    function f() {
        var name = 'wcm'
        return function () {
            alert(this.name)
        }
    }
    f()()

4 函数作为某个对象的方法执行时,this指向直接对象。

 var obj = {
        name: 'test',
        f: f1
    }
    function f1() {
        alert(this.name)
    }
    obj.f()

5 隐式丢失

1 函数当作某个对象得方式执行赋值给另一个变量,此时this指向window

var obj = {
        name: 'test',
        f: f1
    }
    function f1() {
        alert(this.name)
    }
    var func = obj.f
    func()

2 参数传递(对象中的方法当作参数传递)

6 内置函数

比如settimout, setinterval,第一个参数函数的this指向window

function f1() {
        var name = 'xxx'
        setTimeout(function () {
            alert(this.name)
        }, 1000)
        console.log(this)
    }
    // var obj1 = obj.f
    f1()

7 间接调用n

1 数组中 forEach(fn, obj)来改变fn中this的指向,不传默认指向window

var obj = {
        name: 'test'
    }
    var arr = [1,2]
    arr.forEach(function (v) {
        alert(this.name)
    }, obj)

8 构造函数 (通过new关键字)

函数内部的this指向当前实例对象

function Person(name) {
        this.name = name
       console.log(this.name)
   }
   var person = new Person('wbb')