和c++的有较大不同
9.png


10.png
11.png
因为js函数可以单独成为变量存起来,所以就有另一种情况了
12.png
这时候this是指代window对象了

上下文由调用方式来决定

得出结论
13.png
并且函数只有被调用,它的上下文才能被确定!
1.png
如该例:
14.png
其实是不知道的
15.png

当调用,比如这样,我们才能知道指代的是这个对象
16.png
如果是提取出来,就是NaN了
17.png
因为说过了这时的this指向window对象,除非我们定义同名全局变量,因为所有的全局变量是属window对象的,换句话说window对象的属性就是全局变量。

规则

5.png

1(对象)

2.png
3.png
同理,只要记住谁调用this就指向谁
4.png

这里outer返回的就是一个对象,所以
5.png

只要理清思路就行
6.png
c[0]就是个对象,按就近原则

2(函数)

7.png
8.png

涉及两种规则
9.png

3(数组【类数组对象】)

10.png
12.png
回顾argumments
函数要点

11.png

连环调用
13.png

4(IIFE)

回顾
函数要点
14.png

15.png

5(时间器)

16.png

17.png

18.png
在匿名函数中上下文就不在适用规则5了,而是适用规则1了,这是因为现在真正调用这个函数的并不是延时器了,而是obj调用的,延时器是只调用最外层的,故this是指obj对象的

6(事件)

1.png

2.png

  1. <style>
  2. div{
  3. width: 200px;
  4. height: 200px;
  5. float: left;
  6. border: 1px solid #000;
  7. margin-right: 10px;
  8. }
  9. </style>
  10. <body>
  11. <div id="box1"></div>
  12. <div id="box2"></div>
  13. <div id="box3"></div>
  14. <script>
  15. function setColorToRed() {
  16. this.style.backgroundColor = 'red';
  17. }
  18. var box1 = document.getElementById('box1');
  19. var box2 = document.getElementById('box2');
  20. var box3 = document.getElementById('box3');
  21. box1.onclick = setColorToRed;
  22. box2.onclick = setColorToRed;
  23. box3.onclick = setColorToRed;
  24. </script>
  25. </body>

3.png
如果直接这样写是会报错的,这是规则5的特性,this为window对象,要解决此问题就要用一个变量备份上下文,因为我们this在不进入时间器之前是指向此元素的,然后在时间器中用此变量调用就是调用该元素

  1. function setColorToRed() {
  2. // 备份上下文
  3. var self = this;
  4. setTimeout(function() {
  5. self.style.backgroundColor = 'red';
  6. }, 2000);
  7. }

7.ES6【箭头函数】

箭头函数->this指向问题

call和apply(指定函数上下文)

6.png
如果要将sum函数变为xiaoming的方法,可以在此对象中书写【如sum: sum】,这样xiaoming就是this,也很明显此函数是为某个对象准备的

不过要是有多个对象岂不是都得书写,我们要是只想完成成绩求和有种更直接的方法,我们可以使用call和apply
7.png
这样函数就会以你指定的上下文来执行,而且函数是天生拥有这两个方法的


区别仅体现在函数有参数的时候,也仅仅形式不一样
8.png
apply会把数组给解构,把5传给b1,把3传给b2

我们传隐式参数就只能用apply方法
9.png

new

构造函数
[

](https://www.yuque.com/u1966341/gxmfqt/ida8ql/edit#PwSYo)