js中的this指向问题小结

最近有点闲暇时间,就来总结js中this的指向问题,如有不对,请指出。
this指向,网上做多的描述是指向那个最终调用的对象。对于这句话,一直不太明白。下面我们用几个例子来理解这个问题。
function a(){
console.log(this.user)
};
var user = 'alisa';
a()//alisa
此时a的调用者是 window ,所以会取定义在全局的user;
例子1.
function a(){
this.user = 'mfz';
console.log(this.user)
}
var user = 'alisa';
a()//mfz;

function a(){
this.user = 'mfz';
user = 'milk';
console.log(this.user)
}
var user = 'alisa';
a()//milk;
例子2.
var a ={
user:'alisa',
fn:function(){
console.log(this.user)
}
}
a.fn();//alisa

箭头函数没有自己的this, 它的this是继承而来; 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象, 定义它的时候,可能环境是window;

var a = {
user:'alisa',
fn:()=>{
console.log(this.user);
}
};
var user = ‘mfz’;
a.fn();//mfz;

下面看下 settimeout 和setinterval 的例子
var a= {
say: function () {
setTimeout(function () {
console.log(this)
});
}
}
a.say();//window

var q= {
say: function () {
setTimeout(() => {
console.log(this)
});
}
}
q.say(); // say()

此时的 this继承自q, 指的是定义它的对象q, 而不是 window!

{
console.log(1,this);//1,window
var xx = "bb"
var obj={
xx:"aa",
foo:()=>{
console.log(2,this,this.xx);//2,window ,bb
}
};
obj.foo()// 此时的this是和 console.log(1,this); 指向一致 所以会打出 bb 而不是aa
}

如果不是箭头函数

{
console.log(1,this);//1,window
var xx = "bb"
var obj={
xx:"aa",
foo:function(){
console.log(2,this,this.xx);//2,obj,aa
}
};
obj.foo()// 此时的this是指向的obj 所以会打印出 aa
}

当有对象形式声明函数时,不存在作用域,里面的匿名函数始终与 最外层指向一致,通过call pllay bind 一些也无法改变其指向
{
console.log(1,this);
var xx = "bb";
var obj={
xx:"aa",
foo:()=>{
console.log(2,this,this.xx);
}
};

 var obj2 = {xx:"obj2-xx"}
 obj.foo.call(obj2)//无法改变其指向,还是和console.log(1,this)同一层 

}

{
console.log(1,this);
var xx = "bb";
var obj={
xx:"aa",
foo:function(){
console.log(2,this,this.xx);
}
};

var obj2 = {xx:"obj2-xx"}
 obj.foo.call(obj2)//指向改变 ,打印出 2,obj2,obj2-xx

}

但是在函数作用域内情况就不一样了 。

下面看两个例子
//普通函数
function foo(){
setTimeout(function(){
console.log(this.id);// 22,指向window
},100);
console.log(this.id)//43 函数作用域问题,只有外面一层受影响
}
var id = 22;
foo.call({id:43});//22 ,43 foo的调用函数始终指向window

//箭头函数
function foo(){
    setTimeout(() => {
        console.log(this.id);//id 是指向foo父级
    },100);
}
var id = 22;
foo.call({id:43});//43
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 葡萄藤PPT JS中this的指向 大家好,我是IT修真院郑州分院第6期的学员王栋,一枚正直、纯洁、善良的前端程序...
    17064阅读 3,757评论 0 2
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,385评论 2 17
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 8,420评论 0 7
  • 在面向对象的语言中(例如Java,C#等),this含义是明确且具体的,即指向当前对象。一般在编译期绑定。而在ja...
    一木_qintb阅读 3,038评论 0 0
  • 与其他语言相比,函数的this关键字在JavaScript中的表现略有不同,此外,在严格模式和非严格模式之间也会有...
    codingC阅读 3,635评论 0 0