this

67 阅读1分钟

函数调用

JS(ES5)里面有三种函数调用形式

func(p1,p2)
obj.child.method(p1,p2)
func.call(context,p1,p1)

第三种调用形式,才是正常调用形式,其他两种都是语法糖,可以等价的变成call形式

func(p1,p2) 等价于
func.call(undefined,p1,p2)

obj.child.method(p1,p2) 等价于
obj.child.method.call(obj.child,p1,p2)

称此代码为转换代码,至此我们的函数调用只有一种形式,

func.call(context,p1,p2)

这样,this就容易理解了

this,就是上面代码中的context。 this 就是call 一个函数时传的context

function func(){
  console.log(this)
}

func.call(undefined) // 可以简写为 func.call()

按理来说打印出来的this就是undefined,但是如果你传的context是null或者undefined,那么window对象就是默认的context

[ ]语法

function fn (){ console.log(this) }
var arr = [fn, fn2]
arr[0]() // 这里面的 this 又是什么呢?

我们可以把 arr0 想象为arr.0( ),虽然后者的语法错了,但是形式与转换代码里的 obj.child.method(p1, p2) 对应上了,于是就可以愉快的转换了:

        arr[0]() 
假想为    arr.0()
然后转换为 arr.0.call(arr)
那么里面的 this 就是 arr 了 :)

箭头函数

箭头函数里面并没有this,如果在箭头函数中看到this,就把他当作箭头函数外面的this即可,箭头函数本身不支持this

总结

  1. this就是你call一个函数的时,传入的第一个参数
  2. 如果你的函数调用形式不是call形式,按照转换代码将其转换为call形式