this的特性
- 函数的调用方式决定了this的值(运行时绑定)
- this在函数执行过程中,
this
一旦被确定,就不可以再改变- this绑定有:默认绑定、隐式绑定、new绑定、显示绑定
1、默认绑定
var name = 'Jenny';
function person() {
return this.name;
}
console.log(person()); //Jenny
这里的this
指向的是window
,所以可以输出Jenny
2、隐式绑定
test函数复制给了obj
对象中的m属性
,且obj
调用了m
,相当于调用了test
,因此此时的test内的this
便指向了obj
。
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m(); // 1
这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象。因此此时fn内的this指向的b这个对象,而b中没有a。
var o = {
a:10,
b:{
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();
3、new绑定
通过构建函数new
关键字生成一个实例对象,此时this
指向这个实例对象。
function test() {
this.x = 1;
}
var obj = new test();
obj.x // 1
情况1:
如果new
的过程中遇到return
,如果return
返回的是一个对象,则this
指向返回的这个对象。
function fn()
{
this.user = 'xxx';
return {};
}
var a = new fn();
console.log(a.user); //undefined
情况2:
如果返回一个简单类型
的时候,则this
指向实例对象
function fn()
{
this.user = 'xxx';
return 1;
}
var a = new fn;
console.log(a.user); //xxx
4、显示修改
apply()、call()、bind()是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。
var x = 0;
function test() {
console.log(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test;
obj.m.apply(obj) // 1