前言
首先要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象;
示例
代码一 以下代码的调用实际上是window.a()的调用,所以this指向window
function a(){
var user = "LiLei";
console.log(this.user); //undefined
console.log(this); //Window
}
a();
代码二 以下代码的调用是o点出来的,所以this指向o,o.user是LiLei,所以输出是LiLei; window.o.fn()的输出结果跟o.fn()的结果是一致的,由此可以知道this的指向是指向调用它的上一级对象.
var o = {
user:"LiLei",
fn:function(){
console.log(this.user); //LiLei
}
}
o.fn();
window.o.fn();
代码三----当this遇到return会发生什么呢?
function fn()
{
this.user = 'LiLei';
return {};
}
var a = new fn;
console.log(a.user); //undefined
function fn()
{
this.user = 'LiLei';
return function(){};
}
var a = new fn;
console.log(a.user); //undefined
function fn()
{
this.user = 'LiLei';
return undefined;
}
var a = new fn;
console.log(a.user); //LiLei
// null虽然是对象 但是是比较特殊的一个
function fn()
{
this.user = 'LiLei';
return null;
}
var a = new fn;
console.log(a.user); //LiLei
总结: 函数如果返回的是对象类型,那么this是指向返回的对象;如果不是对象,this指向函数的实例; 这里涉及到new的原理实现,可参考javascript---原型链;里面有一个new操作符的实现.