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

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

函数调用模式中的this

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

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

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

解决方法一:

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 指向是不可改变的


昵称不能随便取
297 声望13 粉丝

没有一个问题是多加一层抽象层解决不了的