zoukankan      html  css  js  c++  java
  • 关于this的指向


    ###一个函数中的this关键字的指向——通常情况,如果一个函数所属一个对象,那么这个函数被这个函数所属的对象调用执行,那么这个this就指向这个这个函数所属的对象
    ###注意:函数中的this指向是在调用时(运行时)决定的,而不是在函数定义的时候决定的。

    例1. ``` function test(){ return this; }

    test(); //window
    window.test(); //window

    这是一个函数声明,由于 test 所属于window对象,在我们调用test()的时候实际上调用test的对象是window(全局对象),所以this指向window。
    <br><br>
    例2.
    

    var obj = {
    test:function(){
    return this;
    }
    }

    obj.test(); //obj

    因为test所属于obj对象,并且由obj对象调用,所以this指向obj。
    <br><br>
    例3.
    

    var obj = {
    a:{
    test:function(){
    return this;
    }
    }
    }

    obj.a.test();

    这里的test所属于a对象,并且由a对象调用,所以this指向a。
    虽然a属于obj,但 test函数 所属于a对象,而不属于obj对象。
    <br><br>
    例4.
    

    var test = function(callBack){
    callBack();
    }

    test(function(){
    console.log(this); //window
    })

    这个回调函数里面的this指向window,因为这个匿名函数由参数调用,这个调用者(也就是这个参数)不所属于任何对象,所以默认的指向了window。
    <br><br>
    例5.
    

    var test = function(){
    arguments0;
    }

    test(function(){
    console.log(this); //arguments
    })

    
    这个是由arguments对象调用,在传递参数时js自动把传递的匿名函数挂载到了arguments对象下,所以这个匿名函数也是所属于arguments对象的,所以this指向了arguments。
    <br/><br/>
    例6.
    

    var obj = {str:"1"};
    var obj2 = {
    test:function(){
    return this;
    }
    }
    obj2.test(); //obj2

    obj.Fn = obj2.test;
    obj.Fn(); //obj

    var temp = obj2.test;
    temp(); //window
    window.temp() //window

    由最终调用执行test的对象决定了test内的this的指向。
    <br/><br/>
    例7.(new关键字)
    

    function test(){



    ---[[return undefined]]---
    }
    Test();

    如果不使用new关键字调用执行,test里面的this指向调用执行test的对象。
    如果不显示的在代码里面使用return,那么这个函数内部会默认的返回undefined。
    <br>
    
    

    function Test(){



    ---[[return this]]---
    }
    var A = new Test();

    如果使用new关键字调用执行,构造函数里面的this指向创建的实例对象A。
    如果不显示的在代码里面使用return返回({},[],RegExp, Date, Function),那么这个构造函数内部会默认返回this(也就是创建的实例对象A)。
    <br/><br/>
  • 相关阅读:
    MYSQL实战-------丁奇(极客时间)学习笔记
    java并发编程实践——王宝令(极客时间)学习笔记
    分布式锁-----秒杀系统
    MYSQL IN 出现的慢查询问题
    携程2018年年度技术合集
    MySQL分库分表
    Mysql 千万级别数据数据查询
    视频协议融合平台人脸识别/车牌识别平台EasyCVR内调用接口二次开发疑难解答
    国标GB28181/Ehone协议视频人脸识别/车牌识别平台EasyCVR新版本支持大华SDK接入开发记录
    国标GB28181协议接入视频智能分析平台EasyCVR的设备用ws_flv为什么会有无法播放的情况?
  • 原文地址:https://www.cnblogs.com/liu-di/p/10396083.html
Copyright © 2011-2022 走看看