• 【js基础修炼之路】— 浅谈this关键字


    在我学习this关键字的时候,通过查找资料总结出一些this的特殊用法,

    供大家参考,代码里面有我总结的分析过程!

    箭头函数里的this:

     var username = "全局";
        var obj = {
            username: '张举欣',
            say() {
                setTimeout(function() {
                    console.log(this.username)
                    //这里的this指向的是定时器,进而指向window
                })
                setTimeout(() => {
                    //箭头函数里的this指的是宿主对象         
                    //没有宿主对象,默认是window
                    console.log(this.username);
    
                })
            }
        }
        obj.say()

    易混淆的this

    window.val = 1;
        var obj = {
            val: 2,
            dbl: function() {
                this.val *= 2; //4
                val *= 2; //2
                console.log(val); //2
                console.log(this.val); //4
            }
        };
        // 说出下面的输出结果
        obj.dbl();
        var func = obj.dbl;
        func();

    // 结果是: 2 4 8 8
    /*val变量在没有指定对象前缀,默认从函数中找,找不到则从window中找全局变量

    即 val *=2 就是 window.val *= 2

    this.val默认指的是 obj.val ;因为 dbl()第一次被obj直接调用

    <2>14行代码调用

    func() 没有任何前缀,类似于全局函数,即 window.func调用,所以

    第二次调用的时候, this指的是window, val指的是window.val

    第二次的结果受第一次的影响*/

    下面在来看一段代码

        var obj = {
            func: function() {
                console.log('我是func');
            },
            say: function() {
                // 此时的this就是obj对象  
                setTimeout(function() {
                    console.log(this);
                    this.func()
                    //使用bind绑定this指向obj
                }.bind(this));
            }
        }
        obj.say(); // obj

    在这里,使用bind绑定this,改变指针的指向!

        var obj = {
            say: function() {
                var f1 = () => {
                    console.log(this); // obj
                    setTimeout(() => {
                        console.log(this); // obj
                    })
                }
                f1();
            }
        }
        obj.say()
      //因为f1定义时所处的函数 中的 this是指的 obj, setTimeout中的箭头函数this继承自f1, 所以不管有多层嵌套,都是 obj
    没有宿主对象的情况
    var obj = {
            say: function() {
    
                var f1 = function() {
                    console.log(this); // window, f1调用时,没有宿主对象,默认是window
                    setTimeout(() => {
                        console.log(this); // window
                    })
                };
                f1();
            }
        }
        obj.say()

    //结果: 都是 window,因为 箭头函数在定义的时候它所处的环境相当于是window, 所以在箭头函数内部的this函数window

    最后注意
    //使用箭头函数,可以让我们解决一些在匿名函数中 this指向不正确的问题; 但是要注意在和普通函数混合的时候,this的指向可能是window !



    记住,在你成功之前,每前进一步遇到的都将是更大的困难,所以微笑面对每一个困难 -----至有理想的自己
  • 相关阅读:
    Oracle索引
    Oracle Union Union All 对查询结果集操作
    Oracle表连接
    BIOS + MBR > UEFI + GPT
    Opensource Licenses
    Linux 系统下使用dd命令备份还原MBR主引导记录
    Linux 文件类型笔记
    Linux 分支那么多,这里可以帮你缩小选择范围
    Arch Linux 的休眠设置
    Arch Linux pacman 与其他发行版操作比较
  • 原文地址:https://www.cnblogs.com/-yu-ze-/p/8521585.html
Copyright © 2020-2023  润新知