说明:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
基本分为以下几种情况:
- 全局作用域或者普通函数中this指向全局对象window。
//直接打印
console.log(this) //window
//function声明函数
function bar () {console.log(this)}
bar() //window
//function声明函数赋给变量
var bar = function () {console.log(this)}
bar() //window
//自执行函数
(function () {console.log(this)})(); //window
上面的例子比较容易理解,下面看一个有些难度的
window.name="window";
var obj={
name:"obj",
innerFunction:function(){
var name="innerFunction";
function innerFnfn(){
console.log(this.name);
}
innerFnfn();
}
}
obj.innerFunction(); //window
2、通过对象调用,指向调用对象
//对象方法调用,指向
var person = {
run: function () {console.log(this)}
}
person.run() // person
//事件绑定
var btn = document.querySelector("button")
btn.onclick = function () {
console.log(this) // btn
}
//事件监听
var btn = document.querySelector("button")
btn.addEventListener('click', function () {
console.log(this) //btn
})
//jquery的ajax
$.ajax({
self: this,
type:"get",
url: url,
async:true,
success: function (res) {
console.log(this) // this指向传入$.ajxa()中的对象
console.log(self) // window
}
});
//这里说明以下,将代码简写为$.ajax(obj) ,this指向obj,在obj中this指向window,因为在在success方法中,独享obj调用自己,所以this指向obj
3、作为构造函数调用,this 指代new 出的对象
function Fn(){
this.user = "me";
}
var a = new Fn();
console.log(a.user); //me
4、call、
apply 调用 ,修改this指向,此方法的第一个参数为改变后调用这个函数的对象,this指代第一个参数
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
//apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。如果把最后一行代码修改为
o.m.apply(o); //1
5、匿名函数的指向环境具有全局性,this通常指向window(包括闭包)
window.name="window";
var obj={
name:"obj",
getName: function(){
return function(){
console.log(this.name) //window
}
}
}
obj.getName()();