浅谈this的指向

       function hd() {
                let name= '小汪'
                console.log(this.name)
        }

        hd()

  这个打印this.name 是undefined 因为,这个this是指向全局,(指向window)

  因为你是在函数内部声明的变量 ,并没有挂载到window上,又因为这个hd函数是window调用的所以这个this.name是undefined

  那么如果我是var呢?

  来看一下打印结果

       function hd() {
                var name = '小汪'
                console.log(this.name)
        }

        hd()

  这个打印也是undefined 还是那句话,你在函数内部声明的话,她是不会挂载到window上

但是如果你在函数外部用var来声明你就可以拿到这个name,因为你函数外部的上级是window上,你声明的变量会挂在他的上级,所以会挂到window上也就是全局,那么你现在的this就可以拿的到

  在来看下边这个栗子

      var o = {
                name: '李四',
                fun: function () {
                        console.log(this.name)//李四
                        console.log(this)//{name: "李四", fun: ƒ}
                }
        }

        o.fun()

  你在全局声明了一个变量o 里边包含了两个元素

然后你通过o.fun去调用 变量o里边的函数,所以他的this.name会指向李四,他的this指向是对象o

如果是普通函数你可以这样简单粗暴一点理解,我是被谁调用的?我就指向谁,通过这个例子 可以看到他是被对象0调用的,所以他就指向o ,那么打印就是o下边的李四,

如果是箭头函数 例如

        var arrows = {
                sex: '男',
                fun: {
                        age: '20',
                        fun: (() => {
                                console.log(this.sex) //undefined
                                console.log(this.arrows)//打印当前对象
                        })
                }
        }
        arrows.fun.fun()

  这个我也是通过对象去调用的,  箭头函数不管你写在第几层,他的指向都是window,所以你打印this.sex是指向不到,通过打印this.arrows可以看到 是可以找到的,因为你var声明的是挂在全局的,所以是可以拿到的。

总结一句话:如果是普通函数,谁调用我就指向谁,箭头函数的指向是全局,也就是说箭头函数的指向如全局 或则说第一层,

个人理解,有不对的地方,欢迎指出

posted @ 2020-05-19 10:31  遇见_明天  阅读(142)  评论(0)    收藏  举报