zoukankan      html  css  js  c++  java
  • 浅析js中的this

    很多人可能会有疑问,this到底是什么?为什么this的值变化多端?
      首先我们来概括下this.
      this是一个对象,一般存在于函数中,表示当前函数的执行上下文;
    值得一提的是,当函数在执行后,this才有绑定的对象,函数未执行时,this没有内容
    接下来我们看看在不同场景下的this的指向
      1.函数默认执行 :此时this指向Window
      function fn(){
            console.log(this)    //Window
        };
    fn();
      IIFE:立即执行函数下this同样指向Window
      (function fn() {
                console.log(this)   //Window
            })();
     在严格模式开启后,this的指向又有所不同

        严格模式下 : this指向undefined

      function fn(){
          "use strict"
            console.log(this)    //undefined
        };
        fn();
      2.函数的隐式执行 : this指向函数的直接执行对象
      function fn(){
                 console.log(this);    
              };
              var a = 10;
              var obj = {
                  a:20,
                 b:fn
              };
             obj.b();        //this指向obj
            var obj2 = {
                 a:30,
                 b:obj.b
             };
             obj2.b();       //this指向obj2
            var obj3 = {
                 a:40,
                b:obj2        
            };
            obj3.b.b();      //obj3.b.b等价于obj2.b this指向obj2

    但当函数作为参数传到另一个函数的变量时, 发生隐式丢失,this指向Window

    function fn(){
                console.log(this)       //Window
            };
            var obj = {
                a:20,
                b:fn
            };
     setTimeout(obj.b, 1000);
            function setTimeout(cb,t){
                cb();              //obj.b作为参数传给cb,而cb前没对象,相当于默认方式执行fn() 
            };

        3.函数的显式执行 : this指向指定对象

    我们可以通过函数的bind、call、apply方式指定this的对象,还可以用来修复上文中的隐式丢失

       var obj = {
            name: "obj",
            show: function () {
                console.log(this.name)
            }
        }
        obj.show();                     //obj
    
        var obj2 = {
            name: "obj2"
        };
        obj.show.bind(obj2)();          //obj2
    
        var name = "蜡笔笑嘻嘻";         
        obj.show.bind(window)();     //Window

        4.构造函数执行(通过new执行)

    构造函数中的this 会指向创建出来的实例对象

        function Person() {
            this.name = 'zhar';
        }
        var p = new Person();
        console.log(p.name);        //zhar
      以上就是对于this的一些理解,欢迎沟通和交流.

     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Beta 阶段计划
    alpha阶段总结
    冲刺第十天 12.6 THU
    冲刺第九天 12.5 WED
    冲刺第八天 12.4 TUE
    冲刺第七天 12.3 MON
    冲刺第六天 11.30 FRI
    正弦交流电有效值系数sqrt(2)的推导
    关于STM32官方FOC库函数扇区分析中’131072’系数的解释
    闭环系统零、极点位置对时间响应性能指标的影响
  • 原文地址:https://www.cnblogs.com/mutuo/p/11438356.html
Copyright © 2011-2022 走看看