新人推荐先看阮大大的书的:相关章节
有关 this 的理解,方老师的这篇 文章 已经很完美了

你应该已经知道并熟记 this 是 call 的第一个参数
下面是一些 this 的特殊情况

1
2
3
4
// 例 1
button.onclick = function f1(){
console.log(this) // 触发事件的元素。 button
}

1 结果:
f1.call(???)
this 是什么?去看 onclick 的源码呀 -> 做不到
MDN 的开发者知道 onclick 的源码
MDN 的开发者写了文档
看文档呀

1
2
3
4
// 例 2
button.addEventListener('click', function(){
console.log(this) // 该元素的引用 button
}

2 结果:
去看 addEventListener 的源码呀 -> 做不到
MDN 的开发者知道 addEventListener 的源码
MDN 的开发者写了文档
看文档呀

1
2
3
4
5
// 例 3
$('ul').on('click', 'li' /*selector*/, function(){
console.log(this) //this 则代表了与 selector 相匹配的元素。
// li 元素
})

3 结果:
去看 on 的源码呀 -> 做不到
jQuery 的开发者知道 onclick 的源码
jQuery 的开发者写了文档
看文档呀

特例:我可以传一个 this 给它

1
button.onclick.call({name: 'ada'})

由于 this 是 call 的第一个参数
这样子 button.onclick 的 this 就变成了 {name:’ada’}

终极例题
理解下面例子,基本上 this 就明白得差不多了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function X(){
return object = {
name: 'object',
options: null,
f1(x){
// 3 下面的 this ?不就是 f1.call()的 this,就是 2 里面的 this:object
this.options = x // 4 这里 x 是 options
this.f2() // 5 this.f2.call() 显然这里 this 也是 object
},
f2(){
this.options.f2.call(this) // 6 这句代码4告诉我们是 options.f2.call(this) 我们把 this:object 传给了 options (特例)
}
}
}

var options = {
name: 'options',
f1(){},
f2(){
console.log(this) // 问 this 是啥 ? // 7 传过来的 object 啊
}
}

var x = X() // 1 这里的 x 是啥?X() return 的 object
x.f1(options) // 2 x.f1.call(x,options) 显然这里 this 就是 x === object

问题:上面代码打印的 this 是什么?
正确答案:object ,思路已经在注释里,按数字顺序理解


参考:
你怎么还没搞懂 this?