1.函数调用模式
//所有的this都是由当前函数决定——>最终都是由函数的4种钓调用模式决定的
//代码1:
function f1(){
console.log(this);
}
//1、把f1函数当成普通函数调用:函数调用模式
// 函数调用模式:
// a、this指向widow,
// b、返回值由return语句决定,如果没有return语句就表示没有返回值
f1();//window
//代码2:
function f2(){
return function(){
console.log(this);
}
}
var f2n=f2();
f2n();//this——>window这也是一次函数调用模式
//代码3:
function f3(){
f3n();//函数调用模式——————>window
function f3n(){
console.log(this);
}
}
f3();
2.方法调用模式
//方法调用模式:
// this:指向调用该方法的对象
// 返回值:由return语句决定
//代码1:
var obj={
age:10,
say:function(){
console.log(this.age);
}
};
obj.say();//方法调用模式
//代码2:
function f1(){
console.log(this);
}
var obj2={
s1:f1//将f1函数的值赋值给obj2.s1属性
};
obj2.s1();//方法调用模式——>this:obj2
//代码3:
var obj3={
age:10,
s1:function(){
console.log(this.age);
}
};
var obj4={
age:20,
s2:obj3.s1//将obj3.s1函数的值赋值给s2属性
};
obj4.s2();//方法调用模式:this——>obj4
// function f5(){
// }
// var a1=f5();//undefeind
// var a2=f5;//a2是一个函数
3.构造函数调用模式
//构造函数调用模式:
// this:指向构造函数的实例
// 返回值:
// a、没有手动添加返回值,默认返回this
// b、return了一个基本数据类型(数字、布尔值、字符串、null、undefined),最终返回this
// c、return了一个复杂数据类型(对象),最终返回该对象
//代码1:
function Person(){
this.age=20;
this.name="张三";
console.log(this);
}
//构造函数调用模式:
var p1=new Person();
//代码2;
function P2(){
this.age=18;
return "abc";
}
var p2=new P2();//p2.age=18
//代码3:
function P3(){
this.age=10;
return {};
}
var p3=new P3();//p3.age:undefined
console.log("p3.age");
console.log(p3.age);
//代码4:
function P4(){
this.age=10;
return [1,3,5];
}
var p4=new P4();//p4.age:undefined
console.log("p4.age");
console.log(p4.age);
4.上下文调用模式
//上下文模式
// this:
// 传递一个null/undefined————————>window
// 传递一个数字、字符串、布尔值——————>对应的基本包装类型的对象
// 传递一个对象:指向该对象
// 返回值:由return语句决定
function f1(){
console.log(this);
}
//上下文模式
f1.call(null);//window
f1.call(undefined);//window
f1.call(1);//Number的实例
f1.call("abc");//String的实例
f1.call(true);//Boolean的实例
var s1="abc";
console.log(s1.length);//3
console.log(s1[0]);//"a"
// 31行代码内部创建了字符串所对应的String构造函数的实例
// {0:"a",1:"b",2:"c",length:3}
// 31行代码执行完毕之后,就会把这个实例给销毁