zoukankan      html  css  js  c++  java
  • [JavaScript]再谈 this

    再谈this

    关于 this,之前有写一篇文章略微涉及到:就是这里

    当时还没理解得很深入,浅尝辄止的感觉,也没有很全面地总结 this 的指向和用法。

    直到我昨晚看到了一篇博文,google搜索 js this 出来的第一篇文章,茅塞顿开,对于 this 有了更直观更全面更细致更清晰的了解!我真希望每一个对 this 感到困惑的朋友可以看到这篇文章,写得很好,感谢这位作者和他的文章。

    先列举一下他的观点:

    1.如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题,你想了解可以自行上网查找。
    2.如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
    3.如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。

    特殊情况:

    this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的。
    (当this碰到return时)如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。

    这样顺着脉络一分析,像下面这种题目,是难不倒我们了:

    function X(){
        return object = {
            name: 'object',
            options: null,
            f1(x){
                this.options = x    // 3.x.f1 被调用后,这里的 this 就是 object,this.options = options
                this.f2()   // 4.x.f1 被调用后,这里的 this 就是 object,所以这里就相当于 object.f2()
            },
            f2(){
                this.options.f2.call(this)  // 5.object.f2() 因为是 object 调用了 f2,所以这里的 this 也是 object ,即 object.options.f2.call(object)
            }
        }
    }
    
    var options = {
        name: 'options',
        f1(){},
        f2(){
            console.log(this) // 6.既然 object 都被当成了 this 传进来了,那这里的 this 毫无以为就是 object
        }
    }
    
    var x = X() // 1.x 是 X 的实例,X 被调用后返回一个对象 object,所以 x === object
    x.f1(options)   // 2.x 调用了 f1,所以这里的 this 就是 x,也就是 object,这句代码相当于 x.f1.call(object,options)
    

    这下可以理解 this 了吧~

    再次感谢这篇博文以及他的作者

  • 相关阅读:
    如何做一名技术管理者
    图表控件amCharts
    Redis
    关于微信,我想说两句
    颜色名称集合
    【翻译】PSV初音Miku Project DIVAf
    【3DS】初音Miku and Future Stars Project
    处女作真人语音计算器上线了
    【PSV】GRAVITY DAZE(重力眩晕)
    看得我老泪横流,自己有多久没有像小女孩这样被惊喜过了?
  • 原文地址:https://www.cnblogs.com/No-harm/p/9685975.html
Copyright © 2011-2022 走看看