认识上下文:函数上下文this指待啥由函数调用方式决定
认识上下文之上下文规则1
上下文规则:1.对象打点其方法函数,则函数的上下文就是这个打点的对象 对象.方法()
四个小例题
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上下文规则</title>
</head>
<body>
<script>
// 上下文规则1:对象打点调用其方法函数,则函数上下文就是打点的对象
// 习题1
function fn() {
console.log(this.a + this.b); //this-obj
}
var obj = {
a: 1,
b: 2,
fn: fn
}
obj.fn()
// 习题2
var obj1 = {
a: 1,
b: 2,
fn: function () {
console.log(this.a + this.b); //this-obj2
}
}
var obj2 = {
a: 3,
b: 4,
fn: obj1.fn
}
obj2.fn()
// 3.
function outer() {
var a = 1
var b = 2
return {
a: 3,
b: 4,
fn: function () {
console.log(this.a + this.b); //this——outer执行结果
}
}
}
outer().fn()
// 4.
function fun() {
console.log(this.a + this.b); //this-{a:3,b:4,c:fun}
}
var obj3 = {
a: 1,
b: 2,
c: [{
a: 3,
b: 4,
c: fun
}]
}
var a = 5;
obj3.c[0].c()
</script>
</body>
</html>
上下文使用规则2
2.圆括号直接调用,则函数上下文就是window对象 方法()
例题1
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上下文规则2</title>
</head>
<body>
<script>
// 使用规则2:圆括号直接使用,函数上下文this是window对象
// 习题1
var obj1 = {
a: 1,
b: 1,
fn: function () {
console.log(this.a + this.b); //this-window
}
}
var a = 3
var b = 4
var fn = obj1.fn
fn(); //圆括号直接调用,this-window
</script>
</body>
</html>
例题2
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=sc, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 习题2:好题
function fun() {
return (this.a + this.b);
}
var a = 1
var b = 2
var obj2 = {
a: 3,
b: fun(), //b=3 因为fun()符合规则2,然后fun()执行结果:a+b=3
fun: fun
}
console.log(obj2.fun());
</script>
</body>
</html>
3上下文规则三
3.数组(类数组对象)枚举出函数进行调用,则上下文就是数组(类数组对象) 数组名index
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上下文规则3</title>
</head>
<body>
<script>
// 上下文规则3:数组(类数组对象)枚举出函数进行调用,上下文对象就是该数组(类数组对象)
// 类数组对象:所有键名从0开始,且待length属性的对象
// 比如:arguments对象,它是函数的实参列表
// 习题1
var arr = [1, 2, 3, function () {
console.log(this[0]); //this-arr
}]
arr[3](); //数组名[index]()
// 习题2:好题
function fun() {
arguments[3]()
}
fun(1, 2, 3, function () {
console.log(this[2]); //this-arguments
})
</script>
</body>
</html>
上下文规则四
4.IIFE中的函数,上下文是window对象 IIFE:立即可执行函数:(function(){})()
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上下文规则4</title>
</head>
<body>
<script>
// 上下文规则4:IIFE的函数,上下文是window对象
// IIFE:立即可执行函数 (function(){})()
// 习题1:好题
var a = 1
var obj = {
a: 2,
fun: (function () {
var a = this.a //规则四: this-window
return function () {
console.log(a + this.a); //规则1:this-obj
//1+2
}
})()
}
obj.fun() //规则1
</script>
</body>
</html>
上下文规则五
5.定时器、延时器调用函数,上下文是window对象 setInterval(函数,时间) setTimeout(函数,时间)
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上下文规则5</title>
</head>
<body>
<script>
// 上下文规则5:使用定时器\延时器调用函数,上下文是window对象 setInterval(函数,时间) setTimeout(函数,时间)
// 习题1
var obj = {
a: 1,
b: 2,
fun: function () {
console.log(this.a + this.b); //this-window
}
}
var a = 3
var b = 4
setTimeout(obj.fun, 2000) //规则5
// 习题2
setTimeout(function () {
obj.fun() //规则1
}, 2000)
</script>
</body>
</html>
上下文规则6
6.事件处理函数的上下文是绑定事件的DOM元素 DOM元素.绑定事件=fuction(){}
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>上下文规则6</title>
<style>
.box {
width: 100px;
height: 100px;
border: 1px solid #000;
margin: 10px;
}
</style>
</head>
<body>
<!-- 上下文规则6:事件处理函数的上下文就是事件绑定的DOM元素 DOM元素.绑定事件=处理函数 -->
<!-- DOM元素.绑定事件=function(){} -->
<!-- 习题1:点击哪个盒子哪个盒子就变红,要求使用同一个事件处理函数 -->
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<script>
var boxs = document.getElementsByClassName('box')
// 习题1:点击哪个盒子哪个盒子就变红,要求使用同一个事件处理函
// for (var i = 0; i < boxs.length; i++) {
// boxs[i].onclick = fun
// function fun() {
// this.style.backgroundColor = 'red' //this-boxs[i]
// }
// }
// 习题2;点击哪个盒子哪个盒子就在1000ms后变红,要求使用同一个事件处理函数 好题
for (var i = 0; i < boxs.length; i++) {
boxs[i].onclick = fun
function fun() {
// 备份上下文 重点
var _this = this //boxs[i]点击后this是boxs[i],将这个this备份起来
setTimeout(function () {
_this.style.backgroundColor = 'green' //_this---boxs[i]
}, 1000)
}
}
</script>
</body>
</html>
call 和apply可以指定上下文
call和apply能指定函数的上下文 函数.call(上下文,参数) 函数.apply(上下文,参数) 区别:函数带参时,call用逗号罗列参数,apply以数组的形式传入零散值
在这里插入代码片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>call 和apply可以指定上下文</title>
</head>
<body>
<!-- 函数.call(上下文) 函数.apply(上下文)-->
<script>
function fun1() {
fun2.apply(this, arguments) //函数.apply(上下文) this-33,44
}
function fun2(a, b) {
console.log(a + b);
}
fun1(33, 44); //圆括号直接调用,this-window对象
</script>
</body>
</html>