美文网首页
还是一道this指向的问题...

还是一道this指向的问题...

作者: 苏敏 | 来源:发表于2017-11-29 13:29 被阅读1次

    遇到一个这样的问题,一层套一层的那种,一起来看下

    var obj = {
      key:1,
      fun: function(callback) {
        var i = 2;
        callback.call(i,this);
      }
    };
    
    obj.fun(function(a,b) {
      console.log(a,b,this);
    })
    

    我们先来明确一下知识点:

    知识点1:.call()方法的作用是将函数内部的this指针指向第一个参数,并将其后的参数作为函数的参数传入,然后调用该函数;

    知识点2:每个函数内部都默认有一个“this”指针,根据函数调用方式的不同,其指向也不同。

    我们明确了这两个点,就接着来看代码:

    obj.fun(function(a,b) {
      console.log(a,b,this);
    })
    

    让我们进入obj.fun方法内部,编译器会将该函数按照如下方式解析:

    // obj.fun
    function(callback) {
      this = obj // 在该方法内,this指针指向obj对象
      callback = function(a,b) {
        console.log(a,b,this)
      }  // 参数率先被赋值
      var i
      i = 2
      callback.call(i,this);
    }
    

    当浏览器解析到callback.call(i,this)这句时,让我们进入callback函数内部看看发生了什么:

    function(a,b) {
      this = 2 // 我们使用call的第一个参数将函数内的this指针指向数字2
      a = obj
      b = undefined // 因为我们在call中只传入了一个参数
      console.log('a:',a,'b:',b,'this:',this);
    }
    //输出结果  a: {key: 1, fun: ƒ}fun: ƒ (callback)key: 1__proto__: Object b: undefined this: Number {[[PrimitiveValue]]: 2}
    
    1. 首先要明白obj.fun()的时候 此时的this指向obj;
    2. 然后要明白callback.call(i,this) 这句代码是在callback内部的this指正改变了指向(callback内部的this本应指向Window),现在变成指向了i;
    3. 然后在看往里面传的参数,callback.call(i,this),只有一个this,然而真正的callback函数function(a,b)是两个参数,所以a=obj(原来的this), 参数b没有传,所以是undefined。

    (可以是试试再传一个参数进去比如callback.call(i,this,10),这时候10就是我们要输出的b了)

    撒花~

    相关文章

      网友评论

          本文标题:还是一道this指向的问题...

          本文链接:https://www.haomeiwen.com/subject/fnpubxtx.html