js--this

152 阅读2分钟

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
  1. 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));