之前读语言精粹的时候一直对函数的调用的理解是模模糊糊,一知半解。尤其是 函数调用模式
更是一头雾水。终于今天让我遇到这个问题了,总算是对函数调用模式
和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 指向是不可改变的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。