JS中的this

红叶何时落水

谁调用就指向谁

当一个对象调用时,this指向这个对象的首地址

    var obj = {
        name: "obj_name",
        obj2: {
            name: "obj2_name",
            func: function() {
                console.log(this.name)
            }

        },
        func: function() {
            console.log(this.name)
        }
    }
    obj.func();
    obj.obj2.func();

输出

    obj_name

    obj2_name

引用类型,变量中只储存了用于指向数据的地址//重点理解

    var name = "window_name";
    var obj = {
        name: "obj_name",
        func: function() {
            console.log(this.name)
        }
    }
    let win = obj.func;//win里储存了func的地址,那么调用win的是window
    win();
    obj.func();

输出

    window_name

    obj_name

函数调用,可以看出,调用this的实际上是window这个最大的对象,name和func实际上可以说是window的属性,正如上面的obj.obj2 //== window.obj.obj2;

    name = "window_name"
    function func() {
        console.log(this.name);
    }
    func();
    console.log(window.func, window.name)

输出

    window_name

    ƒ func() {
            console.log(this.name);
        } window_name

构造函数调用,new关键字会返回一个对象,this就指向这个对象的地址

    var name = "window_name";

    var func = function() {
            this.name = "func_name";
            console.log(this.name)
        };
    var func_obj = new func();
        console.log(func_obj.name)

输出

    func_name
    func_name

apply,call动态调用

obj1.func1只代表了函数的储存地址,call(obj2)为调用者,将函数放到自己的作用域内执行

   var name = "window_name";

    var obj1 = {
        name: "obj1_name",
        func1: function() {
            console.log(this.name)
        }
    }
    var obj2 = {
        name: "obj2_name",
        func2: function() {
            console.log(this.name)
        }
    }
  
    obj1.func1.call(obj2);//=>obj2_name

    obj2.func2.call(obj1)//=>obj1_name

箭头函数单纯的对象套用指向最外层

    var name = "window_name";
    var obj2 = {
        name: "obj2_name",
        func2: () => {
            console.log(this.name)
        },
        obj3: {
            name: "obj3_name",
            func3: () => {
            console.log(this.name)
        },  
        }

    }

    obj2.func2();
    obj2.obj3.func3();

输出

    window_name
    window_name

箭头函数在被函数套用时,指向上一层

    var name = "window_name";
    var obj2 = {
        name: "obj2_name",
        func2: () => {
            console.log(this.name)
        },
        obj3: {
            name: "obj3_name",
            func3: function () {
                return (() => {
                    console.log(this.name)
                })()
            },
        }

    }

    obj2.func2();
    obj2.obj3.func3();

输出

    window_name
    obj3_name

 函数的套用,会使其失去this指向,实际上,现在是window在调用函数

    name = "window"
    function foo(x) {
        setTimeout(function() {
            console.log(this.name);
        }, 1000)
    }
    function foo2() {
        setTimeout(() => {
            console.log(this.name);
        }, 1000)
    }
    let obj = {
        name: "obj",
        fn: foo,
        fn2: foo2,
        fn3: () => {
            console.log(this.name)
        }
    }
    obj.fn();//=>window
    obj.fn2();//=>obj
    obj.fn3();//=>window

function一旦调用了function,就会自动把this指向window

    var name = "window_name";
    var obj2 = {
        name: "obj2_name",
        func2: () => {
            console.log(this.name)
        },
        obj3: {
            name: "obj3_name",
            func3: function () {
                console.log("1:"+this.name);
                return (() => {
                    console.log("2:"+this.name);
                    (function () {
                        console.log("3:"+this.name);
                        return (() => {
                            console.log("4:"+this.name);
                        })()

                    })()

                })()
            },
        }

    }

    // obj2.func2();//
    obj2.obj3.func3();

输出

    1:obj3_name

    2:obj3_name

    3:window_name

    4:window_name

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红叶落水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值