this的指向问题一篇搞定
目录
- this指向五种类型
- 补充点(执行上下文和作用域)
this指向五种类型
- 作为对象的属性(方法)被调用 作为对象的属性(方法)被调用是this指向这个对象
var obj={
name:"luca",
sayThing:function(){
console.log("我叫"+name);
}
}
obj.sayThing();//我叫Luca
- 作为普通函数被调用 当作为普通函数被调用,时this指向全局对象,在浏览器,常是window对象
window.topname="上帝";
function getname(){
console.log(this.topname);//上帝
}
- 作为函数构造器被调用 作为函数构造器被调用时,用new操作符调用函数时,返回是一个对象,this就指向该对象
var Person=function(){
this.name="xiaomi";
}
var person=new Person();
console.log( person.name);//xiaomi
- call和apply call和apply可以动态的改变函数的this
var obj1={
sex:"男";
getsex:function(say=""){
return say+this.sex;
}
var obj2={
sex:"女";
}
console.log(obj1.getsex.call(obj2,"我是"));//第一个参数是this指向的对象,第二个参数传的是参数列表
console.log(obj1.getsex.apply(obj2,["我是"]));//第一个参数是this指向的对象,第二个参数传的是数组
- 箭头函数中的this指向 箭头函数不会创建this,它会从自己作用域链的上一层继承this
window.list=3;
var obj={
list:1,
getlist:()=>{
console.log(this.list);}
obj.getlist();//3
执行上下文
执行上下文可以当做是js代码运行的环境,分为全局上下文和局部上下文,每个上下文都有一个关联的变量对象,这个上下文定义的所有变量和函数都存在这个对象上。 每个函数调用都有自己的上下文,当代码执行流进入函数时,函数上下文就会推到上下文栈里面,因为栈是先进后出,所以里面的函数执行完以后,上下文栈就会弹出该函数上下文。因此可以看到每个上下文都不能搜索到下级上下文的变量和函数
作用域链
上下文代码在执行时,会创建一个变量对象的作用域链,这个作用域链决定了各级上下文在访问变量和函数的顺序
作用域链增强
try/catch语句中的catch语句 with语句 作用域链增强就是在作用域链前端临时添加一个上下文