一,什么是this指向?
1.在js中,this的意思为“这个;当前”,是一个指针型变量,它动态指向当前函数的运行环境。
2.在不同的场景中调用同一个函数,this的指向也可能会发生变化,但是它永远指向其所在函数的真实调用者;如果没有调用者,就指向全局对象window。
二,this的使用场景
1.全局使用
在浏览器全局环境下,this 始终指向全局对象(window), 无论是否严格模式
this===window // true
普通函数 非严格模式下,指向window。严格模式下,指向 undefined
function f() {
console.log(this === window);
}
f() // true
function f() {
'use strict';
console.log(this === undefined);
}
f() // true
2. 对象方法中
var obj ={
foo: function () {
console.log(this);
}
};
obj.foo() // obj
上面代码中,obj.foo方法执行时,它内部的this指向obj。
var a = {
p: "Hello",
m: function () {
console.log(this.p);
},
};
console.log(a.m()); // Hello
上面代码中,a.m方法执行时,它内部的this指向a,所以执行this.p的时候就相当于执行a.p。
var a = {
p: "Hello",
b: {
m: function () {
console.log(this.p);
},
},
};
console.log(a.b.m()); // undefined
m方法中的this指向指的不是a,而是a.b,所以a.p是拿不到的,只可以拿到a.b.p
var b = {
m: function () {
console.log(this.p);
},
};
var a = {
p: "Hello",
b: b,
};
a.b.m(); // 等同于 b.m()
3.构造函数中使用
构造函数中的this,指的是实例对象。
var Obj = function (p) {
this.p = p;
};
var o = new Obj('Hello World!');
o.p // "Hello World!"
上面代码定义了一个构造函数Obj。由于this指向实例对象,所以在构造函数内部定义this.p,就相当于定义实例对象有一个p属性。
4.DOM事件处理函数
事件处理函数内部的 this 指向触发这个事件的对象
var Box = document.getElementById('box');
oBox.onclick = function () {
console.log(this) //Box
}
5. 箭头函数中的 this
箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值。
function Person() {
setInterval(() => {
console.log(this) //Person
}, 3000);
}
var p = new Person();
以上 this 指向 Person
var a = () => {
console.log(this);
};
a();
上面代码定义了一个方法,由于箭头函数不绑定this,所以指向了window