和c++的有较大不同
因为js函数可以单独成为变量存起来,所以就有另一种情况了
这时候this是指代window对象了
上下文由调用方式来决定
得出结论
并且函数只有被调用,它的上下文才能被确定!
如该例:
其实是不知道的
当调用,比如这样,我们才能知道指代的是这个对象
如果是提取出来,就是NaN了
因为说过了这时的this指向window对象,除非我们定义同名全局变量,因为所有的全局变量是属window对象的,换句话说window对象的属性就是全局变量。
规则
1(对象)
同理,只要记住谁调用this就指向谁
这里outer返回的就是一个对象,所以
只要理清思路就行
c[0]就是个对象,按就近原则
2(函数)
3(数组【类数组对象】)
回顾argumments
函数要点
连环调用
4(IIFE)
回顾
函数要点
5(时间器)
在匿名函数中上下文就不在适用规则5了,而是适用规则1了,这是因为现在真正调用这个函数的并不是延时器了,而是obj调用的,延时器是只调用最外层的,故this是指obj对象的
6(事件)
<style>
div{
width: 200px;
height: 200px;
float: left;
border: 1px solid #000;
margin-right: 10px;
}
</style>
<body>
<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>
<script>
function setColorToRed() {
this.style.backgroundColor = 'red';
}
var box1 = document.getElementById('box1');
var box2 = document.getElementById('box2');
var box3 = document.getElementById('box3');
box1.onclick = setColorToRed;
box2.onclick = setColorToRed;
box3.onclick = setColorToRed;
</script>
</body>
如果直接这样写是会报错的,这是规则5的特性,this为window对象,要解决此问题就要用一个变量备份上下文,因为我们this在不进入时间器之前是指向此元素的,然后在时间器中用此变量调用就是调用该元素
function setColorToRed() {
// 备份上下文
var self = this;
setTimeout(function() {
self.style.backgroundColor = 'red';
}, 2000);
}
7.ES6【箭头函数】
call和apply(指定函数上下文)
如果要将sum函数变为xiaoming的方法,可以在此对象中书写【如sum: sum】,这样xiaoming就是this,也很明显此函数是为某个对象准备的
不过要是有多个对象岂不是都得书写,我们要是只想完成成绩求和有种更直接的方法,我们可以使用call和apply
这样函数就会以你指定的上下文来执行,而且函数是天生拥有这两个方法的
区别仅体现在函数有参数的时候,也仅仅形式不一样
apply会把数组给解构,把5传给b1,把3传给b2
new
构造函数
[