最近发现这个this还真的不能随便写,因为它实际的指向可能跟你想的不太一样,因此就会出现一些莫名其妙的问题,比如 ****undefined 为了避免这些错误,必须得搞懂this
先提一句:this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
例1:
function f1(){
var user = '二狗子';
alert(this.user); //undefined
alert(this); //object window
}
f1(); //实际上就是 window.f1();
这里调用方法f1的是window对象,也就是说this指向window对象,所以会出现this.user 为undefined
例2:
var a = {
user: '二狗子',
f1: function () {
alert(this.user);
}
}
a.f1(); //二狗子
这里调用方法f1的是对象a,就是说this指向a对象,所以this.user为a对象里面的“二狗子”
接下来朝深处看看
例3:
var a = {
user: '二狗子',
f1: function () {
alert(this.user);
}
}
window.a.f1(); //二狗子
这段代码跟例2 比就是多了个window. 结果还是一样的,想说明什么问题呢,看下段代码
var a = {
user: '二狗子',
b: {
user: '大傻子',
f1: function () {
alert(this.user);
}
}
}
a.b.f1(); //大傻子
看见没,结果变成“大傻子”了,对比两段代码再结合最上面说的this指向调用它的对象,也就表名第一段代码是对象a调用的方法f1,第二段代码是对象b调用的,得出结论:在这种链式情况下,this指向的是它上一级的对象。可能表达的不太准确,反正就是那个意思。
再把b对象里面的user注释掉看看
var a = {
user: '二狗子',
b: {
//user: '大傻子',
f1: function () {
alert(this.user);
}
}
}
a.b.f1(); //undefined
这里的this应该是指向b对象的,但是b里面没有user啊,肯定就是undefined,通过this就把指代的对象给定死了,反正this就是指的b,我不管你里面有没有这个user,没有就返回undefined,我可不会去拿a的user,千万别与链式作用域搞混了,像下面这样
var user = '大傻子';
function f1(){
var user = '二狗子';
alert(user); //二狗子
}
f1();
function f2(){
alert(user); //大傻子
}
f2();
睁大眼看清楚了,这里没有this啊,所以执行f1的时候直接就是f1里面的user “二狗子”,执行f2的时候因为f2里面没有user,所以就朝外找,找到了外面的user "大傻子"
不能再多说了,待会该迷糊了。
再加个例子吧
例4:
function f1(){
this.user = "二狗子";
}
var a = new f1();
alert(a.user); //二狗子
其实就是new 关键字可以改变this的指向,通过new关键字,把一个对象实例给了a,同时this的指向也变成了a对象
还想说的一点就是,看博客或者看其他东西不要太跟着博主的思路,首先不敢保证他说的就完全正确,毕竟那也只是基于他的理解,除非这个人就是权威;其次,有时候太跟着博主的思路走,容易把你给陷进去,因为你总是不由自主的想要往要往博主的思路上靠,其实你是在按照别人的思路在思考,有时候可能就把你自己的想法给湮没掉了,说不定你的想法更加简单,更加深刻。