this指向

134 阅读1分钟

作为对象的方法调用

  • 指向该对象
var obj ={
   a:1,
   getA:function(){
       alert( this === obj);    //true
       alert(this.a)   //1
   }
}

作为普通函数调用

  • 指向全局对象,window
window.name = 'globalName';
var getName = function(){ 
    return this.name;
};
console.log( getName() ); // 输出:globalName
或者:
window.name = 'globalName';
var myObject = { 
    name: 'sven',
    getName: function(){ 
        return this.name;
    }
};
    var getName = myObject.getName; 
    console.log( getName() ); // globalName

构造器调用

  • 当用new运算符调用函数时,该函数会返回一个对象,通常构造器里的this指向返回的这个对象(显式返回一个object类型的对象,会返回这个对象)
var MyClass = function(){ 
    this.name = 'sven';
};
var obj = new MyClass();
alert ( obj.name ); // 输出:sven

//显式返回对象
var MyClass = function(){
    this.name = 'sven';
    return { // 显式地返回一个对象
        name: 'anne' }
    };
var obj = new MyClass();
alert ( obj.name ); // 输出:anne

Function.prototype.call或Function.prototype.apply调用

  • 可以动态改变传入函数的this
var obj1 = { 
    name: 'sven',
    getName: function(){ 
        return this.name;
    } 
};
var obj2 = {
    name:'anne'
};
console.log(obj1.getName()); //sven
console.log(obj1.getName.call(obj2));  //anne

总结:谁调用的指向谁


Q:两个方式区别

1.
var getId = function( id ){
    return document.getElementById( id );
};
getId( 'div1' );

2.
var getId = document.getElementById; 
getId( 'div1' );

document.getElementById方法,document调用,指向document
第一种方式,方法内部this指向document
第二种方式 getId('div1')引用document.getElementById,window调用,this指向window