函数调用模式中的this

以前读语言精粹的时候一直对函数的调用的理解是模模糊糊,只知其一;不知其二。尤为是 函数调用模式 更是一头雾水。终于今天让我遇到这个问题了,总算是对函数调用模式this 有了一个相对来讲比较清楚的认识。java

javascrit中的this有一个特性就是:运行期绑定(不包括箭头函数),因此this能够是 全局对象当前对象 或者 任意对象这彻底取决于函数的调用方式函数

函数调用模式中的this

以此模式调用函数时, this 会被绑定到全局对象。这是一个语言上的设计错误。举个栗子:this

var Chat = {
    func1 () {
        //...
        this.func2()    //这里会报错: func2 is not a function
     }
    func2 () {
        //...
    }
}

出现这种错误的缘由就是,this 没有绑定到Chat对象上,而是绑定到全局对象上了。致使,方法不能利用内部函数。设计

解决方法一:code

var Chat = {
    func1 () {
        //定义一个变量that赋值给this,那么内部函数能够经过that访问到this
        var that = this      
        this.func2()    
     }
    func2 () {
        //...
    }
}

解决方法二:对象

var Chat = {
    func1 (){
        Chat.func2()      //谁的方法,谁调用  
     }
    func2 () {
        //...
    }
}

箭头函数中的this

function taskA() {
  this.name = 'hello'

  var fn = function() {
    console.log(this)
    console.log(this.name)
  }

  var arrow_fn = () => {
    console.log(this)
    console.log(this.name)
  }
  fn()
  arrow_fn()
}
taskA()

首先根据 词法做用域 ,因为它自己没有this,因而便向上查找this。接下来,发现taskA是有this的,因而便直接继承了taskA的做用域。继承

那么,问题来了:taskA的this又是什么呢?
taskA是一个普通函数,普通函数的this是在运行时决定的,因为咱们是直接调用taskA的,即taskA(),因此其this即是window。因此,在这个例子中,arrow_fn中的this是window作用域

因此,综上所述:箭头函数中的this是定义的时候就决定的。另外,还须要注意的一点是:它的 this 指向是不可改变的it

相关文章
相关标签/搜索