zoukankan      html  css  js  c++  java
  • this指向总结

    this指向问题

    定义:this是函数运行时所在的环境对象。this指向在函数定义时候无法确定,只有在函数调用时候才可以确定。实际上this指向的是最终调用它的那个对象,即:谁调用的就指向谁

    非严格模式下,没有挂载对象的函数,this指向window,有挂载对象的指向调用对象。严格模式下,没有挂载对象的函数,this指向undefined

    纯粹的函数调用

    • 通常属于全局调用,因此this指向全局对象window
    • let定义的变量不是window对象,因此
    var a = "全局a"
    // let a = "let变量"
    function test(){
        var a = "局部a"
        console.log(this.a)
    }
    test()    // '全局a'
    

    对象方法调用

    • this指向该对象
    var a = "222"
    let obj1 = {
        a:'111',
        test:function(){
            console.log(this.a)
        }
    }
    obj1.test()   // '111'
    
    

    作为构造函数调用

    • 构造函数中的this指向实例化出的新对象
    function Test(){
        this.a = "1111"
    }
    var test = new Test()
    console.log(test.a)  // '1111'
    
    

    改变this指向的调用

    apply
    var a = "ok"
    var obj1 = {
        a:'111'
    }
    var obj2 = {
        a:'222',
        test:function(){
            console.log(this.a)
        }
    }
    obj2.test.apply(obj1)   // '111'
    
    call
    同apply,传参不同,apply以数组形式传入,call以字符串形式按顺序传入
    
    bind
    • ES5新方法
    • bind之后不会立即执行,需要单独调用,传参与call相同
    var obj = {
        init: 1,
        add: function(a, b) {
            return a + b + this.init;
        }
    }
    obj.add(1, 2); // 4
    
    var plus = obj.add;
    plus(3, 4); // NaN,因为 this.init 不存在,这里的 this 指向 window/global
    
    apply、call、和bind传参比较
    plus.call(obj, 3, 4) // 8
    plus.apply(obj, [3, 4]); // 8, apply 和 call 的区别就是第二个参数为数组
    plus.bind(obj, 3, 4); // 返回一个函数,这里就是 bind 和 call/apply 的区别之一,bind 的时候不会立即执行
    plus.bind(obj, 3, 4)(); // 8 
    

    箭头函数调用

    • 箭头函数中的this是在定义函数的时候绑定的,而非调用时候,因此箭头函数的this指向一致是固定的,即被定义函数的this指向
    let obj={
        a:222,
        fn:function(){    
            setTimeout(()=>{console.log(this.a)});
        }
    };
    obj.fn()  //'222'
    
  • 相关阅读:
    Vmware 添加虚拟磁盘
    2019-2020-2 《网络对抗技术》 Exp3 免杀原理与实践
    Docker 容器更换软件源
    Docker 查看容器 Linux 版本
    OpenMediaVault 5 进阶配置(四) Portainer 管理 Docker
    Portainer 中文文档:部署
    树莓派 部署 Docker 数据库容器
    通过Cookie统计上次网页访问时间
    用JavaMail通过QQ邮箱来发送邮件(第一篇博客,备忘)
    删掉双系统
  • 原文地址:https://www.cnblogs.com/nanhuaqiushui/p/14403871.html
Copyright © 2011-2022 走看看