有一个关于this指向的问题

有一个关于this指向的问题

题:

var name='name';

    var A={

        name:'A',

        sayHello:function(){

            let s=()=>console.log(this.name);

            return s

        }

    }

    let sayHello=A.sayHello()

    sayHello()   //A

    var B={

        name:'B'

    }

    sayHello.call(B)   //A


提问:

 sayHello()   //A 

 sayHello:function(){

            let s=()=>console.log(this.name);

            return s

        }

 这个输出A是因为函数中包含一个箭头函数,箭头函数中的this指向是由上级作用域的this值确定的,所以要输出A嘛?

为什么sayHello.call(B)输出的还是A?,call不是传入什么绑定什么嘛

还有一个题:

var name='Jay'

    function Person(name){

        this.name=name

        console.log(this.name);

    }

    var a=Person('Tom')  //Tom

    console.log(name);  //jay   //正确答案:Tom

    console.log(a);   //tom  //正确答案:undefined

    var b=new Person('Michaek')  //Michaek

    console.log(b);  //michaek  //正确答案:Person{name:'Michaek'}

提问: console.log(name); 为什么输出的还是Tom?为啥不是全局的var name='Jay'?

console.log(a)为什么输出的是undefined?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕星星 2022-03-22 10:46:13

同学你好, 解答如下:

1、第一次Person调用,是window调用的,函数内的this指向window。全局定义的name值也是在window上定义的

https://img1.sycdn.imooc.com//climg/6239380309e6484703600037.jpg

所以this.name='Tom'改变的是全局的name值,输出name值也为Tom 。

2、Person函数没有设置返回值,默认为undefined,所以调用Person后会返回undefined,接收返回值的a变量值也为undefined。

自己再理解下。

  • 提问者 一只少年 #1

    老师的意思是,虽然一开始var name='Jay'定义了全局变量,但是var a= Person('Tom'),将全局变量的name变为了Tom,所以console.log(name)也就是全局的变量name已经是Tom所以输出的也是Tom。

     而var b=new Person('Michaek'输出Michaek是因为new关键字,将构造函数中的this指向了新的对象,所以返回的是新对象传入的Michaek

        console.log(b);  输出的是返回这个新创造的对象
    这样理解正确嘛?


    2022-03-22 10:59:45
  • 好帮手慕星星 回复 提问者 一只少年 #2

    这样理解没问题。

    2022-03-22 11:29:45
好帮手慕星星 2022-03-22 10:26:21

同学你好,解答如下:

1、是的 ,sayHello在A对象作用域中,所以this指向A,,this.name值为A。

2、call方法对箭头函数不适用。即使改变了this指向B,但是箭头函数没有this,看的是sayHello方法在A作用域中,所以this.name值还是A 。

3、如果将箭头函数改为普通函数

https://img1.sycdn.imooc.com//climg/6239339509b614c204230279.jpg

两次this会分别指向window和B。第一次sayHello()是window调用的,第二个用call方法指向了B

https://img1.sycdn.imooc.com//climg/6239339c09c9a4f308730111.jpg

祝学习愉快!

  • 提问者 一只少年 #1

    老师还有另外一个问题,我把之前的修改了一下,麻烦再看一下

    2022-03-22 10:30:42
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师