this指向与强制更改this指向。
1,如果在全局函数中调用this,则this指向的是window。
如下:
<!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>Document</title>
</head>
<body>
</body>
<script>
function fn() {
console.log(this)
}
fn()
</script>
</html>
这时在控制台输出可以很明显的看出这时的this指向是window。
2,如果在对象的方法中调用this, this指向调用者。
如a.b.c.fn() 调用者是c 看函数名前面的是谁。this指向的就是谁。
3,事件处理函数中的this, this指向事件源。
4,定时器(setTimeout setInterval)函数中的this,this指向window 。
强制更改this指向。
强制更改this指向的方法有三种。
1,apply()
使用格式: 函数名.apply(this指向的对象,原函数的参数数组)。
【注意】 apply会让原函数立即执行。 apply第二个参数是一个数组。
2,call()
使用格式: 函数名.call(this指向的对象是原函数的参数列表。) ;
【注意】 call()也会让原函数立即执行,call方法从第二个参数开始,传入的参数是原函数的参数。
3,bind()
使用格式: 函数名 = 函数名.bind(this指向的对象,参数列表…)。
会返回一个新的函数,这个函数的内容与原函数一模一样。但是里面的this指向已经被修改了。
【注意】bind函数不会立即执行。
三种方法的区别。
apply, call ,bind 这三种方法的区别。
1.apply ,call 方法会立即执行,而bind方法会返回一个新的函数,函数中的this以及被修改了。
2.apply 和 call方法的区别就在于 传参的形式不同,apply的参数是一个数组。 call和bind方法都是从第二个参数开始为原函数的参数列表。