为了账号安全,请及时绑定邮箱和手机立即绑定

关于闭包或者是作用域的问题

关于闭包或者是作用域的问题

扬帆大鱼 2019-03-20 18:14:18
function student () {    var name = 'xxx';    var getName = function () {        return name    }    var setName = function (newName) {        name = newName;    }    return {        getName: getName,        setName: setName,        name: name    }}var studentA = student();console.log(studentA.getName())studentA.setName("aaa");console.log(studentA.getName())console.log(studentA.name);为啥输出了是按道理不是名字已经变成aaa了吗?更具指导是要在get和set里面都加上this.name就可以了,请问是为什么,我之前写的两个name不是同一个作用域?我知道了,我把闭包分配的空间和return的空间混淆在一起了,所以没用this是对闭包的 空间的修改然后用this是对这个return的对象的修改
查看完整描述

4 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

name是原始类型,return的那一刻把name的值拷贝了了一份返回了,以后name的任何修改都影响不到你的返回值


查看完整回答
反对 回复 2019-04-05
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

这里面其实有两个name属性:

  1. 一个是函数student的私有属性。

  2. 一个是执行student函数返回的对象。

getNamesetName方法设置的都是student的私有属性name
而最后一行输出的是返回对象的name属性。
由于name属性是值类型,所以不会像引用类型一样,出现一处引用改变,其他引用这个对象的变量也改变的情况。


查看完整回答
反对 回复 2019-04-05
  • 4 回答
  • 0 关注
  • 374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号