this
是Javascript语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
随着函数使用的场合不同,this的值会发生变化,但是有一个总的原则:那就是this指的是,调用函数的那个对象
1.纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
var x = 1;
function test(){
this.x = 0;
}
test();
alert(x); //0
这里的this就是Global 所以在函数内改变了x的值,在外面执行alert(x)之后,x就是0了
2.作为对象方法的调用
function test() {
alert(this.x)
}
var o = {};
o.m = test;
o.x = 2;
o.m();//2
函数还可以作为某个对象的方法调用,这时this就是指这个上级对象
3.作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //2
- apply()调用
apply()是函数对象的一个方法,他的作用是改变函数的调用对象,他的第一个参数就是代表改变后的调用这个函数的对象,因此,this就是指这第一个参数,例子:
var x = 2;
function test() {
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m.apply();//2
apply()参数为空时,默认调用全局对象,因此这时的运行结果为0,
证明this指的是全局对象。
如果把最后一行代码改成 o.m.apply(o),那么运行结果就是1,
证明了这时,this指的是对象o
call()调用产生的效果是一模一样的,只是传参的方式不一样。如下所示: call的参数需要一个一个传,而apply的参数是可以以数组的形式传的
function hello(name,age){
console.log(name);
console.log(age);
}
hello.call(this,"tsrot",24);
hello.apply(this,["tsrot",24]);
call和apply直接执行函数,而bind需要再一次调用。
var obj = {
x: 81,
};
var foo = {
getX: function() {
return this.x;
}
}
console.log(foo.getX.bind(obj)());
console.log(foo.getX.call(obj));
console.log(foo.getX.apply(obj));