js中的this到底是谁

js中函数的4中调用方式

1作为普通函数来调用,this的值指向window,准确的说this为null,但是被解释成了window,但是在ECMA5标准中把null解释成了undefined


function foo(){
  console.log(this.age);
}

foo();

2作为对象的方法来调用,this指向调用那一刻的调用者obj,也就是该对象

 
 var obj={
    xx:999,
    yy:888,
    t:function(){
        alert(this.xx);//相当于obj.xx
    }
 };
obj.t();//999


/*关于调用“那一刻”的例子,虽然原来是obj在调用,
但是在dog.t=obj.t后,调用者成了dog,所以此时this指向了dog
*/
var dog ={
    xx:'huzi'
};

dog.t=obj.t;
dog.t();//huzi

3作为构造函数调用时,也就是声明对象,因为在js中没有类的概念,创建对象是用构造函数来完成的,或者直接用json 来写对象。
形成1个空对象constructor,也就是{};
this指向该空对象



function Animal(name.age){
    this.name = name;
    this.age =  age;
    this.bark:function(){
        console.log('i am'+this.name+'!');
    }
/*this.bark中的this指向空对象constructor,但
    是console中的this指向谁还不知道,因为此时还没有
    调用者
*/
}
var dog = new Animal('huzi',5);//形成对象的一个实例,this此时指向了dog
dog.bark()//i am huzi

.函数作为构造函数时,return的值是忽略的,还是返回对象,
它绑定的this指向新创建的对象,并默认返回对象(this),也就是说,不需要在最后写return this;。

4 函数被call,apply调用时

'函数名.call(对象,参数1,参数2)'
function t(num){
    console.log('我的真实年龄是' + this.age);
    console.log('但我一般告诉别人我的年龄' + (this.age+num);

}
 
 var zhangsan = {
    'name':'zhangsan',
    'age':30
 }
 t.call(zhangsan,5);
 /*
 首先,函数t中的this指向对象(zhangsan);
 然后,运行t(参数1,参数2……参数n);
 这个就是对象冒充

  */


你可能感兴趣的:(js中的this到底是谁)