JavaScrept中this在不同的情况中会指代不同的事物,不把this的指代规则弄清楚的话会给内部函数的使用带来很多不便,下面按我的理解解释一下this的指代情况。
第一种情况:函数调用:
直接调用一个函数,这个函数中的this指代全局变量window。代码:
function a(){
console.log(this);
}
a();
这段代码的结果是打印Window,即全局变量。
第二种情况:对象调用:
函数作为对象的一个属性且经由对象调用这个函数,这个函数的this指代调用函数的对象。
代码:
var a = {
b : function() {
console.log(this);
}
}
a.b();
这段代码的结果是打印a这个Object,函数b的this指代对象a。
针对以上两种情况,有以下代码:
var a = {
b : function (){
alert(this)
}
}
function c() {a.b()}
c();
这段代码的结果是打印Object,原因是虽然是函数调用,但函数内部进行了对象调用,所以打印的不是全局变量。
其实可以以一个简便的方法理解以上两种情况this的指代,若通过 对象名.函数名() 的形式来调用就是对象调用,this指代对象。
第三种情况:构造器调用
一个函数直接调用this指代全局变量,但若以这个函数作为构造函数new一个对象并用这个对象来调用,则this指代这个对象
代码:
function a(){
this.b =function(){
congsole.log(this)
}
}
var c = new a();
c.b();
this指代c
第四种情况:apply调用
apply的参数若为空则this指代全局对象,若参数为对象则指代此对象
代码:
var a = {
b:function(){
console.log(this)
}
}
a.b.apply(); //this为全局变量
a.b.apply(a); //this为a
总而言之,函数的this永远指向调用它的对象,若函数被直接调用,那么调用它的对象默认为全局对象Window
第一次写博客,如有不足,还望指正。