关于this
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象。(其实这个说法仍然值得讨论)
①
function a(){
var user="nannan";
console.log(this.user);//undefined
console.log(this);//window
}
a();
因为this指向的是调用它的对象,这里的函数a实际上是被windo对象所点出来的。
②再看下面这个:
var o={
user:"nannan";
fn:function(){
console.log(this.user);//nannan
}
}
o.fn()
这里当你调用o.fn.时才执行,对象就是指向o;根据谁调用就指向谁的原则,这里this指向的对象就是o;
③再看下面这个:
var o={
user:"nannan";
fn:finction(){
console.log(this.user)//nannan;
}
}
window.o.fn();
这里的this没有指向window,首先我们知道,window是js的全局对象,创建的变量实际上是在给window添加属性,所以这里应该指向wondow.o对象
再看一个:
var o={
q:10;
b:{
q:5,
fn.function(){
console.log(this.q);//5
}
}
}
o.b.fn();
这里的对象依然是o,但this却没有执行。
把上面三段代码归结一下,:
①如果一个函数中有this,但是它没有被上一级对象调用,则this依然是指向了window。(不考虑严格版)
②如果一个函数被上一级的对象所调用,那么this指向的就是上一级的对象。
③this指向的是它上一级的对象,参考例三。
不管这个函数中包含几个对象,还是被第几层的函数所调用。
再看下面这个
var 0{
a:10;
b:{
a:5,
fn:function(){
console.log(this.a);//undefined
console.log(this.a);//window
}
}
}
var j=o.b.fn;.
j();
这里虽然函数fn是对象b来引用。但是把它赋给j时并没有执行,只是一个赋值所以最终的指向依然是window。即this永远指向最后调用它的对象,它执行的时候要看看是谁调用的。
与例三不同的是,例三有直接执行了fn
构造函数版的this
function Fn(){
this.user:"nannan";
}
var a=new fn();
console.log(a.user);//nannan
这里的对象a能够点出fn中的user,是因为new关键字就是创建一个对象实例。可以理解成复制了一份fn到对象a里面,但此时仅仅为创建但没有执行,而调用这个函数fn的对象a,则this指向的自然是对象a,对象a中有user是因为用了关键字new相当于复制了一份。