1、作为对象的方法调用
// 作为对象被调用
var obj = {
a:1,
getName:function(){
console.log(this === obj);
console.log(this.a);
}
}
obj.getName(); // true 1
浏览器结果
2. 作为普通函数调用
window.name = 'globalName';
var getName = function(){
return this.name;
}
console.log(getName()); // globalName
window.name = "globalName";
var myobj = {
name:'freddy',
getName:function(){
return this.name;
}
}
var getName = myobj.getName;
console.log(getName()); // globalName
在 ECMAScript 5 的 strict 模式下,这种情况下的 this 已经被规定为不会指向全局对象,而
是 undefined:
function func(){
“use strict”
alert ( this ); // 输出:undefined
}
func();
3. 构造器调用
// 作为构造器使用
var Myclass = function (){
this.name = 'freddy';
}
var myclass = new Myclass();
console.log(myclass.name); // freddy
console.log("=========3========")
var Animal = function(){
this.name = "动物";
// 显式返回一个对象类型数据
return {
name:"seven"
}
}
var animal = new Animal();
console.log(animal.name); // seven
console.log("=========4========")
var Person = function(name){
this.name = name;
// 显式地返回一个非对象类型数据
return "name";
}
var p = new Person("freddyhuang");
console.log(p.name); // freddyhuang
显式地返回了一个 object 类型的对象,那么此次运算结果最终会返回这个对象,如果构造器不显式地返回任何数据,或者是返回一个非对象类型的数据,就不会造成上述问题
4. Function.prototype.call 或 Function.prototype.apply 调用
// Function.prototype.call 或 Function.prototype.apply 调用
var obj1 = {
name:'fredddy',
getName:function(){
return this.name;
}
}
var obj2 = {
name:'seven'
}
console.log(obj1.getName()) // fredddy
console.log(obj1.getName.call(obj2)) // seven