
关于JavaScript中的this的取值:
函数在创建的时候,会创建两个隐藏属性:函数的上下文、实现函数行为的代码(调用属性);以及prototype属性、length属性。
函数在调用的时候,除了声明时定义的形式参数,还接收两个附加参数:this和arguments。
this的值取决于函数的调用模式,函数有4种调用模式:方法调用模式、函数调用模式、构造函数调用模式、apply调用模式。
1. 方法调用模式:
函数作为对象的属性被调用时叫做方法。调用表达式中有提取属性的动作(点、[]),那么它就被当作一个方法来调用。
此时,this被绑定到该对象上。
this到对象的绑定发生在调用的时候。这种超级“延迟”绑定的好处是函数可以对this高度复用。
例子:
function test() {
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m();//1
2. 函数调用模式:
函数不是作为对象的属性被调用。此时,this被绑定到全局对象。
例子:
var x = 1;
function test() {
alert(this.x);
}
test(); //1
3. 构造函数调用模式:
通过new操作符调用构造函数,此时this绑定到新创建的对象实例上。
构造函数内的return返回值可以改变this值。如果return返回的是对象(null除外),则this绑定到该对象;其他情况,this绑定到新创建的对象实例上。
例子:
function fn() {
this.user = '追梦子';
return {};
}
var a = new fn;
console.log(a.user); //undefined
4. apply调用模式:
apply方法构建一个参数数组传递给构造函数。允许我们选择this值。
接收两个参数:第一个参数是要绑定给this的值,第二个参数是一个参数数组。
例子:
var x = 0;
function test() {
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m.apply();//0
阅读文章:
1. 《JavaScript》语言精粹第4章函数
2. 阮一峰的网络日志 《JavaScript的this用法》 网址:http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html
3. 追梦子的博客 《彻底理解js中this的指向》 网址:http://www.cnblogs.com/pssp/p/5216085.html