在javascript中,this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。
下面来解释一下this绑定的四种情况:
1、默认绑定
默认绑定全局变量
function fn() {
console.log( this.a );
}
var a = 2;
fn();
// 2 -- fn单独调用,this引用window
2、隐式绑定
this引用的是函数据以执行的环境对象
function fn() {
console.log( this.a );
}
var obj = {
a: 2,
fn: fn
};
obj.fn();
// 2 -- this引用obj。
3、显式绑定
apply()、call()和bind()在特定的作用域中调用函数,实际上等于设置函数体内this对象的值
function fn() {
console.log( this.a );
}
var obj = {
a: 2
};
fn.call( obj );
// 2
apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。二者的作用相同,区别仅在于接收参数的不同。对于call()方法而言,第一个参数是this值没有变化,传递给函数的参数必须逐个列出来,apply()方法第二个参数是一个参数数组。
bind()。这个方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值。
4、new绑定
如果是一个构造函数,那么用new来调用,那么绑定的将是新创建的对象
function fn(a) {
this.a = a;
}
var bar = new fn( 2 );
console.log( bar.a );
// 2