美文网首页
js中的this指向问题小结

js中的this指向问题小结

作者: AlisaMfz | 来源:发表于2018-05-15 21:11 被阅读52次

最近有点闲暇时间,就来总结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

相关文章

  • js中的this指向问题小结

    最近有点闲暇时间,就来总结js中this的指向问题,如有不对,请指出。this指向,网上做多的描述是指向那个最终调...

  • JS进阶篇-this指向问题

    JS中this的指向问题不同于其他语言,JS中的this不是指向定义它的位置,而是在哪里调用它就指向哪里。 JS中...

  • js中this指向问题

    this的指向在函数定义的时候是无法确定的,只有函数执行的时候才能确定this到底指向谁,实际this指向是调用他...

  • JS中this指向问题

    首先声明,添加删除线的都是不太确定的 下面我们分情况解释: 1、函数调用模式--当一个函数并非一个对象的属性时,那...

  • js中this指向问题?

    This是一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。 this 是在函数被调用时确...

  • js中this的指向问题

    this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用,下面分...

  • js 中 this 的指向问题

  • JS中的this指向问题

    1. this的几种绑定方法 (1)普通函数中的this指向函数的调用点 (2) call明确绑定 (3)bind...

  • JS 中的 this指向问题

    程序员就是没有人情味的原始人,不懂交际。谈不到对象。每天就是查看a-z,0-9加上!@#¥%…/&()+-=/<>...

  • js中的this指向问题

    只要记住这句话,谁调用的就指向谁,既调用函数所处的父层 window 对象 此时的this=>foo,如果改成这样...

网友评论

      本文标题:js中的this指向问题小结

      本文链接:https://www.haomeiwen.com/subject/tmdydftx.html