1.函数调用
2.方法调用
3.构造器调用
4.上下文形态
第一种函数调用:
使用函数调用模式调用函数时,非严格模式下,this被绑定到全局对象;在严格模式下,this是undefined。
function A(){ console.log(this); } A();//window function A(){ 'use strict'; console.log(this); //undefined } A();
第二种:方法调用:
只会执行一段代码,同时方法中的 this 是方法的所有者,即当前的实例对象;返回值由 return 语句决定。
var obj = { name: '5se7en', say: function(){ console.log(this.name); } } obj.say();//方法调用模式 5se7en function A(){ console.log(this); } var obj2 = { say: A //将A函数赋值给obj2的say属性 } obj2.say();//方法调用模式。this指向obj2 var obj3 = { name: '57', say: function)({ console.log(this.name) }) } var obj4 = { name: '伍柒', say: obj3.say //将obj3.say函数赋值给obj4的say } obj4.say();//方法调用模式:this——>obj4
第三种:构造器函数调用:
会用来创建一个对象,还是执行一段代码,this 表示当前对象
//没有手动return添加返回值,默认返回 this
function Person(){
this.name = '5se7en';
this.age = 18;
console.log(this);
}
var p1=new Person();
console.log(p1.name) //5se7en
//返回了一个基本数据类型(number / boolean / string / null / undefined),最终返回 this
function P2(){
this.age=18;
return "abc";
}
var p2=new P2();
console.log(p2.age) //18
// 返回了一个复杂数据类型(对象),最终返回该对象
function P3(){
this.age=10;
return {};
}
var p3=new P3();
console.log(p3.age); //undefined
// 返回了一个复杂数据类型(对象),最终返回该对象
function P4(){
this.age=10;
return [1,3,5];
}
var p4=new P4();
console.log(p4.age);//undefined
第四种: 上下文形态(apply, call)
//如果有参数的情况 var obj1 = {}; function sum(x,y){ return x+y; } console.log(sum.call(obj1,1,2));//3 console.log(sum.apply(obj1,[1,2]));//3