作为对象的方法调用
- 指向该对象
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