一、this指向
- 每一个函数内部都有一个关键字this
- this的值, 和函数的调用有关, 与函数书写无关
1. 普通调用方式
- 一个普通的全局函数, 在正常调用的情况下, this === window
function fn() {
console.log(this);
}
fn()
2. 函数放置到对象
- 如果将函数放置到对象, 通过对象的语法去获取到并调用, 那么this === 对象
function fn() {
console.log(this);
}
var obj = {
a: 1,
b: '我是对象obj的属性B',
c: fn
}
obj.c()
3. 事件处理函数
- 如果将函数作为事件处理函数, 那么触发的时候, 内部的this指向了事件源
<div id="box">div>
<style>
#box {
width: 50px;
height: 50px;
background-color: rgb(235, 135, 223);
}
style>
function fn() {
console.log(this);
}
var box = document.getElementById('box');
box.onclick = fn
4. 计时器
- 如果将函数作为定时器执行时的函数, 那么触发的时候, 内部的this指向了全局对象window
function fn() {
console.log(this);
}
setTimeout(fn, 0);
setInterval(fn, 1000);
二、改变this指向
- 需求: 我想让这个函数在不改变结构的情况下, 让其内部的 this === obj
var obj = {
a: 1,
b: 2,
c: '我是对象obj的属性c'
}
function fn(x, y) {
console.log(this, x, y)
}
fn(100, 200)
1. call()
- 语法:
函数.call(this指向谁, 参数1, 参数2, 参数3...)
- 第二个位置的参数, 会传递到函数中
var obj = {
a: 1,
b: 2,
c: '我是对象obj的属性c'
}
function fn(x, y) {
console.log(this, x, y);
}
fn(100, 200)
fn.call(obj, 300, 400)
2. apply()
- 语法:
函数.apply(this指向谁, [参数1, 参数2, 参数3])
- 第二个位置的数组内数据, 会传递到函数内部
var obj = {
a: 1,
b: 2,
c: '我是对象obj的属性c'
}
function fn(x, y) {
console.log(this, x, y);
}
fn(100, 200)
fn.apply(obj, [500, 600]);
3. bind()
- 语法:
函数.bind(this指向谁, 参数1, 参数2, 参数3...)
- 第二个位置的参数开始, 会传递到函数中
- 注意: bind 方法不会立即执行函数, 他会返回一个内部this修改完毕的新函数
var obj = {
a: 1,
b: 2,
c: '我是对象obj的属性c'
}
function fn(x, y) {
console.log(this, x, y);
}
fn(100, 200)
var newFn = fn.bind(obj, 700, 800);
newFn()