this指向理解

this 是一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。

1.作为纯粹的函数调用 this 指向全局对象

2.作为对象的方法调用 this 指向调用对象

3.作为构造函数被调用 this 指向新的对象(new 会改变 this 的指向)

4.apply 调用 this 指向 apply 方法的第一个参数

首先必须要说的是,this的指向在函数定义的时候是确定不了的,
只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
() function a() { var user = "这是this"; } a(); // window.a(); console.log(this.user); //undefined console.log(this); // window //由于this最终指向的是调用它的对象,这里的函数a实际是被Window对象所点出来的 ()

` var o = {
user: “这是this”,
fn: function() {
// console.log(this.user); //这是this
// console.log(this);

        }
    }
    o.fn();

    //这里的this指向的是对象o,因为调用这个fn是通过o.fn()执行的,那自然指向就是对象o,
    //this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁
    var o = {
        a: 10,
        b: {
            // a: 12,
            fn: function() {
                console.log(this.a); // undefined
                console.log(this); //object

            }
        }
    }
    o.b.fn();
    //这里可以看到,this指向的并不是对象o中的属性a,而是对象b中的属性a,
    //因为如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象,
    //如果一个函数中有this,这个函数中被多个对象所调用,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
    `

var o = { a: 10, b: { a: 12, fn: function() { console.log(this.a); // undefined console.log(this); // window } } } var j = o.b.fn; j();
//this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,
//虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window

    `
    function Fn() {
        this.user = "这是this";
        console.log(this); // Fn
    }
    var a = new Fn();
    console.log(a.user); // 这是this


    //对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么a是对象,
    //因为用了new关键字就是创建一个对象实例,
    //这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),
    //此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a,
    //至于对象a中会有user,因为已经复制了一份Fn函数到对象a中,用了new关键字就等同于复制了一份
    `

猜你喜欢

转载自blog.csdn.net/meikaied/article/details/87933317