zoukankan      html  css  js  c++  java
  • this指向问题

    JavaScript 的 this 原理      参考:http://www.ruanyifeng.com/blog/2018/06/javascript-this.html

    匿名函数的this始终指向Windows

      var name = "The Window";
      var object = {
        name : "My Object",
        getNameFunc : function(){
          return function(){
            return this.name;
          };
        }
      };
      alert(object.getNameFunc()());  //the Window

    以下除了匿名函数

    1、对象调用函数的时候,函数里面会有一个隐式的赋值操作   var  this = 调用的对象 (没有调用对象,即执行函数 fun(),其实就是window调用,结果还是window),其它的如何情况都不会存在隐式的操作  this 的值。

    //对象方法调用
    var person = {
        run: function () {console.log(this)}
    }
    person.run() // person

      https://blog.csdn.net/qq_33988065/article/details/68957806

    2、(这个太平常了,不用特别去套理论,构造函数就是这样用的)new一个对象时,同样可以看做是对象调用构造函数(事实上构造函数确实执行了),构造函数里面隐式的执行了   var  this = 调用的对象 。

    3、对象调用函数的时候,函数内才会出现 this改变的情况,即隐式的出现  var  this = 调用的对象。其它情况 this 都不操作,里面的this 都是作用域链上游的  this值;

      函数调用函数,不会出现var this重新赋值的情况,如下面的多层函数调用。只有第一个函数是window对象调用  fun()函数,fun函数先进行隐式操作 var this = window,

      fun() 里面的函数没有对象调用,只是函数调用函数(执行函数),所以fun2函数的 this 根据作用域链就近原则,最近的this,就是fun函数里面的this = window。

        function fun2() {
            console.log(this);
        }
        function fun1(fun2) {
            fun2();
        }
        function fun(fun1) {
            fun1(fun2);
        }
        
        fun(fun1);

     this的指向在 调用(即运行) 的时候确定,全局下的函数中的this不一定指向的是window,看谁在调用它。所以所以引起混淆。(这点和变量的作用域,变量的作用域是 声明的时候确定的,而不是运行时)

    如:下面init函数没有人调用,通过赋值,把init函数赋值给了obj.fun函数,最后是obj在调用fun函数,init函数并没有直接执行。

        function init() {
            console.log(this.name);
        }
    
        function test(){
            var obj= {};
            obj.name = "中国"
            obj.fun = window.init;
            obj.fun();
        }
        test();  //  中国    // 这里this指向obj

    感悟:vue.js中出现这种情况,分析出上面的这种的this指向。所以在实际项目中框架(或库、插件)中的参数调用外部的函数,外部函数千万不要带this

        因为我们不知道框架内是怎么实现的,这个this被指向哪个对象了。如果内部的this指向很明确就没关系了,如

    下面的this很明确的指向obj2,init 函数到了其它函数里面,不管怎么变,init内的结构不会变,this指向就不会改变。
      function init() {
            var obj2 = {
                name : "小李",
                fun2 : function () {
                    console.log(this.name);
                }
            }
            obj2.fun2();
        }
    View Code

    总结(个人):   this指向问题可以把他看做是一个变量,利用js作用域链就可以很好确定 this指向谁了。


    箭头函数的this指向

    1、剪头函数this的指向是定义时this的指向,而不是调用时this的指向。(这个和 es5 的this指向是不一样的

    手动绑定 this 的指向:https://www.jianshu.com/p/87e3f586f35f

    1、this 都是在函数内出现(全局上不需要this,就是window),函数本身就是一个对象。所有的函数的原型上都有,绑定this的方法。

      a、call, apply (是改变this指向,立即执行的。)

      b、bind  (返回了一个新的函数,这是创建了一个新函数,并没有改变原来的函数)

      总结:可以这样理解,call, apply绑定的函数,在执行时,先执行了 this = 绑定的object。而 bind 函数是创建了一个新的函数,这个新的函数第一行就是 this = 绑定的object。两者都不会导致原函数的变化。

  • 相关阅读:
    bzoj 3035 二分答案+二分图最大匹配
    bzoj 1058 bst
    bzoj 1093 缩点+DP
    bzoj 1452 二维树状数组
    bzoj 1968 数学
    bzoj 1034 贪心
    牛客小白月赛12 I (tarjan求割边)
    Loj 103、10043 (KMP统计子串个数)
    poj 2356 (抽屉原理)
    hdu 1907 (尼姆博弈)
  • 原文地址:https://www.cnblogs.com/wfblog/p/9155211.html
Copyright © 2011-2022 走看看