• this


    JavaScript的函数内部如果调用了this,那么这个this到底指向谁?答案是,视情况而定!如果以对象的方法形式调用,该函数的this指向被调用的对象。

    function getAge(){
        var y = new Date().getFullYear();
        return y - this.birth;
    }
    var xiaoming = {
        name: '小明',
        birth: 1990,
        age: getAge
    };

    在上面xiaoming.age()中,this指的是xiaoming,但是如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window。并且要保证this指向正确,必须用obj.xxx()的形式调用!

    console.log(xiaoming.age();  //27
    console.log(getAge());   //NaN
    var fn = xiaoming.age;
    console.log(fn());  //NaN

    有些时候,喜欢重构的你把方法重构了一下,结果又报错了!原因是this指针只在age方法的函数内指向xiaoming,在函数内部定义的函数,this又指向undefined了!(在非strict模式下,它重新指向全局对象window,因为函数是独立调用,而不是方法调用)。

    var lilei = {
        name:'李雷',
        birth:1996,
        age:function(){
          function getAgeFromBirth(){
               var y = new Date().getFullYear();
               return y - this.birth;
          }
          return getAgeFromBirth();
        }
    }
    console.log(lilei.age());   //NaN

    此时,我们可以用一个变量来捕获this。

    var hanmeimei = {
        name:'韩梅梅',
        birth:1996,
        age:function(){
            var that = this;
            function getAgeFromBirth(){
                var y = new Date().getFullYear();
                return y - that.birth;
            }
            return getAgeFromBirth();
        }
    }
    console.log(hanmeimei.age());  //21

    下面的test()函数是独立调用,而不是方法调用,所以this默认绑定到window。

    var a = 0;
    function faa(){
       function test(){
          console.log(this.a);
       }
       return test;
    };
    var aa ={
        a:2,
        faa:faa    
     }
     aa.faa()();  //0

    由于闭包的this默认绑定到window对象,但又常常需要访问嵌套函数的this,所以常常在嵌套函数中使用var that = this,然后在闭包中使用that替代this,使用作用域查找的方法来找到嵌套函数的this值 。

    var b= 0;
    function fbb(){
        var that = this;
        function test(){
            console.log(that.b);
        }
            return test;
    };
    var  bb = {
        b:2,
        fbb:fbb
    }
    bb.fbb()();  //2
  • 相关阅读:
    flutter item列表左右滑动带出按钮选项
    flutter之Dismissible组件
    mac下最好用的抓包工具--charles简单操作教程
    flutter 开起charles抓包代理
    nodejs querystring模块
    node.js 中使用 Mongodb
    MongoDB 的高级查询 aggregate 聚合管道
    Mongodb 关系型数据库表(集合)与表(集合)之 间的几种关系
    Mongodb 的使用以及 Mongodb 账户权 限配置
    MongoDb 大数据查询优化、 MongoDB 索引、复合索引、唯一索引、 explain 分 析查询速度
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/9161604.html
Copyright © 2020-2023  润新知