函数调用
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
总结
- this就是你call一个函数的时,传入的第一个参数
- 如果你的函数调用形式不是call形式,按照转换代码将其转换为call形式